prediction-market-agent-tooling 0.43.2__py3-none-any.whl → 0.44.0__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.
Files changed (20) hide show
  1. prediction_market_agent_tooling/abis/depositablewrapper_erc20.abi.json +279 -0
  2. prediction_market_agent_tooling/abis/erc20.abi.json +221 -314
  3. prediction_market_agent_tooling/abis/erc4626.abi.json +623 -0
  4. prediction_market_agent_tooling/abis/proxy.abi.json +24 -0
  5. prediction_market_agent_tooling/gtypes.py +1 -1
  6. prediction_market_agent_tooling/markets/agent_market.py +2 -1
  7. prediction_market_agent_tooling/markets/manifold/manifold.py +3 -2
  8. prediction_market_agent_tooling/markets/omen/data_models.py +2 -1
  9. prediction_market_agent_tooling/markets/omen/omen.py +81 -62
  10. prediction_market_agent_tooling/markets/omen/omen_contracts.py +37 -12
  11. prediction_market_agent_tooling/markets/omen/omen_resolving.py +15 -5
  12. prediction_market_agent_tooling/markets/omen/omen_subgraph_handler.py +15 -0
  13. prediction_market_agent_tooling/markets/polymarket/polymarket.py +2 -1
  14. prediction_market_agent_tooling/tools/contract.py +360 -10
  15. {prediction_market_agent_tooling-0.43.2.dist-info → prediction_market_agent_tooling-0.44.0.dist-info}/METADATA +1 -1
  16. {prediction_market_agent_tooling-0.43.2.dist-info → prediction_market_agent_tooling-0.44.0.dist-info}/RECORD +19 -17
  17. prediction_market_agent_tooling/abis/wxdai.abi.json +0 -279
  18. {prediction_market_agent_tooling-0.43.2.dist-info → prediction_market_agent_tooling-0.44.0.dist-info}/LICENSE +0 -0
  19. {prediction_market_agent_tooling-0.43.2.dist-info → prediction_market_agent_tooling-0.44.0.dist-info}/WHEEL +0 -0
  20. {prediction_market_agent_tooling-0.43.2.dist-info → prediction_market_agent_tooling-0.44.0.dist-info}/entry_points.txt +0 -0
@@ -1,4 +1,5 @@
1
1
  import json
2
+ import os
2
3
  import time
3
4
  import typing as t
4
5
  from contextlib import contextmanager
@@ -20,6 +21,7 @@ from prediction_market_agent_tooling.tools.gnosis_rpc import (
20
21
  GNOSIS_NETWORK_ID,
21
22
  GNOSIS_RPC_URL,
22
23
  )
24
+ from prediction_market_agent_tooling.tools.utils import should_not_happen
23
25
  from prediction_market_agent_tooling.tools.web3_utils import (
24
26
  call_function_on_contract,
25
27
  send_function_on_contract_tx,
@@ -65,6 +67,11 @@ class ContractBaseClass(BaseModel):
65
67
  address: ChecksumAddress
66
68
 
67
69
  _abi_field_validator = field_validator("abi", mode="before")(abi_field_validator)
70
+ _cache: dict[
71
+ str, t.Any
72
+ ] = (
73
+ {}
74
+ ) # Can be used to hold values that aren't going to change after getting them for the first time, as for example `symbol` of an ERC-20 token.
68
75
 
69
76
  def call(
70
77
  self,
@@ -151,11 +158,45 @@ class ContractBaseClass(BaseModel):
151
158
  return Web3(Web3.HTTPProvider(cls.CHAIN_RPC_URL))
152
159
 
153
160
 
161
+ class ContractProxyBaseClass(ContractBaseClass):
162
+ """
163
+ Contract base class for proxy contracts.
164
+ """
165
+
166
+ abi: ABI = abi_field_validator(
167
+ os.path.join(
168
+ os.path.dirname(os.path.realpath(__file__)), "../abis/proxy.abi.json"
169
+ )
170
+ )
171
+
172
+ def implementation(self, web3: Web3 | None = None) -> ChecksumAddress:
173
+ address = self.call("implementation", web3=web3)
174
+ return Web3.to_checksum_address(address)
175
+
176
+
154
177
  class ContractERC20BaseClass(ContractBaseClass):
155
178
  """
156
179
  Contract base class extended by ERC-20 standard methods.
157
180
  """
158
181
 
182
+ abi: ABI = abi_field_validator(
183
+ os.path.join(
184
+ os.path.dirname(os.path.realpath(__file__)), "../abis/erc20.abi.json"
185
+ )
186
+ )
187
+
188
+ def symbol(self, web3: Web3 | None = None) -> str:
189
+ symbol: str = self.call("symbol", web3=web3)
190
+ return symbol
191
+
192
+ def symbol_cached(self, web3: Web3 | None = None) -> str:
193
+ web3 = web3 or self.get_web3()
194
+ cache_key = create_contract_method_cache_key(self.symbol, web3)
195
+ if cache_key not in self._cache:
196
+ self._cache[cache_key] = self.symbol(web3=web3)
197
+ value: str = self._cache[cache_key]
198
+ return value
199
+
159
200
  def approve(
160
201
  self,
161
202
  api_keys: APIKeys,
@@ -175,6 +216,45 @@ class ContractERC20BaseClass(ContractBaseClass):
175
216
  web3=web3,
176
217
  )
177
218
 
219
+ def transferFrom(
220
+ self,
221
+ api_keys: APIKeys,
222
+ sender: ChecksumAddress,
223
+ recipient: ChecksumAddress,
224
+ amount_wei: Wei,
225
+ tx_params: t.Optional[TxParams] = None,
226
+ web3: Web3 | None = None,
227
+ ) -> TxReceipt:
228
+ return self.send(
229
+ api_keys=api_keys,
230
+ function_name="transferFrom",
231
+ function_params=[sender, recipient, amount_wei],
232
+ tx_params=tx_params,
233
+ web3=web3,
234
+ )
235
+
236
+ def balanceOf(self, for_address: ChecksumAddress, web3: Web3 | None = None) -> Wei:
237
+ balance: Wei = self.call("balanceOf", [for_address], web3=web3)
238
+ return balance
239
+
240
+ def get_in_shares(self, amount: Wei, web3: Web3 | None = None) -> Wei:
241
+ # ERC-20 just holds the token, so the exact amount we send there, is the amount of shares we have there.
242
+ return amount
243
+
244
+
245
+ class ContractDepositableWrapperERC20BaseClass(ContractERC20BaseClass):
246
+ """
247
+ ERC-20 standard base class extended for wrapper tokens.
248
+ Altough this is not a standard, it's seems to be a common pattern for wrapped tokens (at least it checks out for wxDai and wETH).
249
+ """
250
+
251
+ abi: ABI = abi_field_validator(
252
+ os.path.join(
253
+ os.path.dirname(os.path.realpath(__file__)),
254
+ "../abis/depositablewrapper_erc20.abi.json",
255
+ )
256
+ )
257
+
178
258
  def deposit(
179
259
  self,
180
260
  api_keys: APIKeys,
@@ -190,41 +270,115 @@ class ContractERC20BaseClass(ContractBaseClass):
190
270
  web3=web3,
191
271
  )
192
272
 
193
- def transferFrom(
273
+ def withdraw(
194
274
  self,
195
275
  api_keys: APIKeys,
196
- sender: ChecksumAddress,
197
- recipient: ChecksumAddress,
198
276
  amount_wei: Wei,
199
277
  tx_params: t.Optional[TxParams] = None,
200
278
  web3: Web3 | None = None,
201
279
  ) -> TxReceipt:
202
280
  return self.send(
203
281
  api_keys=api_keys,
204
- function_name="transferFrom",
205
- function_params=[sender, recipient, amount_wei],
282
+ function_name="withdraw",
283
+ function_params=[amount_wei],
206
284
  tx_params=tx_params,
207
285
  web3=web3,
208
286
  )
209
287
 
210
- def withdraw(
288
+
289
+ class ContractERC4626BaseClass(ContractERC20BaseClass):
290
+ """
291
+ Class for ERC-4626, which is a superset for ERC-20.
292
+ """
293
+
294
+ abi: ABI = abi_field_validator(
295
+ os.path.join(
296
+ os.path.dirname(os.path.realpath(__file__)), "../abis/erc4626.abi.json"
297
+ )
298
+ )
299
+
300
+ def asset(self, web3: Web3 | None = None) -> ChecksumAddress:
301
+ address = self.call("asset", web3=web3)
302
+ return Web3.to_checksum_address(address)
303
+
304
+ def deposit(
211
305
  self,
212
306
  api_keys: APIKeys,
213
307
  amount_wei: Wei,
308
+ receiver: ChecksumAddress | None = None,
309
+ tx_params: t.Optional[TxParams] = None,
310
+ web3: Web3 | None = None,
311
+ ) -> TxReceipt:
312
+ receiver = receiver or api_keys.bet_from_address
313
+ return self.send(
314
+ api_keys=api_keys,
315
+ function_name="deposit",
316
+ function_params=[amount_wei, receiver],
317
+ tx_params=tx_params,
318
+ web3=web3,
319
+ )
320
+
321
+ def withdraw(
322
+ self,
323
+ api_keys: APIKeys,
324
+ assets_wei: Wei,
325
+ receiver: ChecksumAddress | None = None,
326
+ owner: ChecksumAddress | None = None,
214
327
  tx_params: t.Optional[TxParams] = None,
215
328
  web3: Web3 | None = None,
216
329
  ) -> TxReceipt:
330
+ receiver = receiver or api_keys.bet_from_address
331
+ owner = owner or api_keys.bet_from_address
217
332
  return self.send(
218
333
  api_keys=api_keys,
219
334
  function_name="withdraw",
220
- function_params=[amount_wei],
335
+ function_params=[assets_wei, receiver, owner],
221
336
  tx_params=tx_params,
222
337
  web3=web3,
223
338
  )
224
339
 
225
- def balanceOf(self, for_address: ChecksumAddress, web3: Web3 | None = None) -> Wei:
226
- balance: Wei = self.call("balanceOf", [for_address], web3=web3)
227
- return balance
340
+ def convertToShares(self, assets: Wei, web3: Web3 | None = None) -> Wei:
341
+ shares: Wei = self.call("convertToShares", [assets], web3=web3)
342
+ return shares
343
+
344
+ def convertToAssets(self, shares: Wei, web3: Web3 | None = None) -> Wei:
345
+ assets: Wei = self.call("convertToAssets", [shares], web3=web3)
346
+ return assets
347
+
348
+ def get_asset_token_contract(
349
+ self, web3: Web3 | None = None
350
+ ) -> ContractERC20BaseClass | ContractDepositableWrapperERC20BaseClass:
351
+ web3 = web3 or self.get_web3()
352
+ contract = init_collateral_token_contract(self.asset(), web3=web3)
353
+ assert not isinstance(
354
+ contract, ContractERC4626OnGnosisChain
355
+ ), "Asset token should be either Depositable Wrapper ERC-20 or ERC-20." # Shrinking down possible types.
356
+ return contract
357
+
358
+ def get_asset_token_balance(
359
+ self, for_address: ChecksumAddress, web3: Web3 | None = None
360
+ ) -> Wei:
361
+ asset_token_contract = self.get_asset_token_contract(web3=web3)
362
+ return asset_token_contract.balanceOf(for_address, web3=web3)
363
+
364
+ def deposit_asset_token(
365
+ self, asset_value: Wei, api_keys: APIKeys, web3: Web3 | None = None
366
+ ) -> TxReceipt:
367
+ for_address = api_keys.bet_from_address
368
+ web3 = web3 or self.get_web3()
369
+
370
+ asset_token_contract = self.get_asset_token_contract(web3=web3)
371
+ # Approve vault to withdraw the erc-20 token from the user.
372
+ asset_token_contract.approve(api_keys, self.address, asset_value, web3=web3)
373
+
374
+ # Deposit asset token (erc20) and we will receive shares in this vault.
375
+ receipt = self.deposit(api_keys, asset_value, for_address, web3=web3)
376
+
377
+ return receipt
378
+
379
+ def get_in_shares(self, amount: Wei, web3: Web3 | None = None) -> Wei:
380
+ # We send erc20 to the vault and receive shares in return, which can have a different value.
381
+ return self.convertToShares(amount, web3=web3)
228
382
 
229
383
 
230
384
  class ContractOnGnosisChain(ContractBaseClass):
@@ -236,7 +390,203 @@ class ContractOnGnosisChain(ContractBaseClass):
236
390
  CHAIN_RPC_URL = GNOSIS_RPC_URL
237
391
 
238
392
 
393
+ class ContractProxyOnGnosisChain(ContractProxyBaseClass, ContractOnGnosisChain):
394
+ """
395
+ Proxy contract base class with Gnosis Chain configuration.
396
+ """
397
+
398
+
239
399
  class ContractERC20OnGnosisChain(ContractERC20BaseClass, ContractOnGnosisChain):
240
400
  """
241
401
  ERC-20 standard base class with Gnosis Chain configuration.
242
402
  """
403
+
404
+
405
+ class ContractDepositableWrapperERC20OnGnosisChain(
406
+ ContractDepositableWrapperERC20BaseClass, ContractERC20OnGnosisChain
407
+ ):
408
+ """
409
+ Depositable Wrapper ERC-20 standard base class with Gnosis Chain configuration.
410
+ """
411
+
412
+
413
+ class ContractERC4626OnGnosisChain(
414
+ ContractERC4626BaseClass, ContractERC20OnGnosisChain
415
+ ):
416
+ """
417
+ ERC-4626 standard base class with Gnosis Chain configuration.
418
+ """
419
+
420
+
421
+ def contract_implements_function(
422
+ contract_address: ChecksumAddress,
423
+ function_name: str,
424
+ web3: Web3,
425
+ function_arg_types: list[str] | None = None,
426
+ look_for_proxy_contract: bool = True,
427
+ ) -> bool:
428
+ function_signature = f"{function_name}({','.join(function_arg_types or [])})"
429
+ function_hash = web3.keccak(text=function_signature)[0:4].hex()[2:]
430
+ contract_code = web3.eth.get_code(contract_address).hex()
431
+ implements = function_hash in contract_code
432
+ if (
433
+ not implements
434
+ and look_for_proxy_contract
435
+ and contract_implements_function(
436
+ contract_address, "implementation", web3, look_for_proxy_contract=False
437
+ )
438
+ ):
439
+ implementation_address = ContractProxyOnGnosisChain(
440
+ address=contract_address
441
+ ).implementation()
442
+ implements = contract_implements_function(
443
+ implementation_address,
444
+ function_name=function_name,
445
+ web3=web3,
446
+ function_arg_types=function_arg_types,
447
+ look_for_proxy_contract=False,
448
+ )
449
+ return implements
450
+
451
+
452
+ def init_collateral_token_contract(
453
+ address: ChecksumAddress, web3: Web3
454
+ ) -> ContractERC20BaseClass:
455
+ """
456
+ Checks if the given contract is Depositable ERC-20, ERC-20 or ERC-4626 and returns the appropriate class instance.
457
+ Throws an error if the contract is neither of them.
458
+ """
459
+ if contract_implements_function(address, "asset", web3=web3):
460
+ return ContractERC4626BaseClass(address=address)
461
+
462
+ elif contract_implements_function(
463
+ address,
464
+ "deposit",
465
+ web3=web3,
466
+ ):
467
+ return ContractDepositableWrapperERC20BaseClass(address=address)
468
+
469
+ elif contract_implements_function(
470
+ address,
471
+ "balanceOf",
472
+ web3=web3,
473
+ function_arg_types=["address"],
474
+ ):
475
+ return ContractERC20BaseClass(address=address)
476
+
477
+ else:
478
+ raise ValueError(
479
+ f"Contract at {address} is neither Depositable ERC-20, ERC-20 nor ERC-4626."
480
+ )
481
+
482
+
483
+ def auto_deposit_collateral_token(
484
+ collateral_token_contract: ContractERC20BaseClass,
485
+ amount_wei: Wei,
486
+ api_keys: APIKeys,
487
+ web3: Web3 | None,
488
+ ) -> None:
489
+ if isinstance(collateral_token_contract, ContractERC4626BaseClass):
490
+ auto_deposit_erc4626(collateral_token_contract, amount_wei, api_keys, web3)
491
+
492
+ elif isinstance(
493
+ collateral_token_contract, ContractDepositableWrapperERC20BaseClass
494
+ ):
495
+ auto_deposit_depositable_wrapper_erc20(
496
+ collateral_token_contract, amount_wei, api_keys, web3
497
+ )
498
+
499
+ elif isinstance(collateral_token_contract, ContractERC20BaseClass):
500
+ if (
501
+ collateral_token_contract.balanceOf(
502
+ for_address=api_keys.bet_from_address, web3=web3
503
+ )
504
+ < amount_wei
505
+ ):
506
+ raise ValueError(
507
+ f"Not enough of the collateral token, but it's not a wrapper token that we can deposit automatically."
508
+ )
509
+
510
+ else:
511
+ should_not_happen("Unsupported ERC20 contract type.")
512
+
513
+
514
+ def auto_deposit_depositable_wrapper_erc20(
515
+ collateral_token_contract: ContractDepositableWrapperERC20BaseClass,
516
+ amount_wei: Wei,
517
+ api_keys: APIKeys,
518
+ web3: Web3 | None,
519
+ ) -> None:
520
+ collateral_token_balance = collateral_token_contract.balanceOf(
521
+ for_address=api_keys.bet_from_address, web3=web3
522
+ )
523
+
524
+ # If we have enough of the collateral token, we don't need to deposit.
525
+ if collateral_token_balance >= amount_wei:
526
+ return
527
+
528
+ # If we don't have enough, we need to deposit the difference.
529
+ left_to_deposit = Wei(amount_wei - collateral_token_balance)
530
+ collateral_token_contract.deposit(api_keys, left_to_deposit, web3=web3)
531
+
532
+
533
+ def auto_deposit_erc4626(
534
+ collateral_token_contract: ContractERC4626BaseClass,
535
+ asset_amount_wei: Wei,
536
+ api_keys: APIKeys,
537
+ web3: Web3 | None,
538
+ ) -> None:
539
+ for_address = api_keys.bet_from_address
540
+ collateral_token_balance_in_shares = collateral_token_contract.balanceOf(
541
+ for_address=for_address, web3=web3
542
+ )
543
+ asset_amount_wei_in_shares = collateral_token_contract.convertToShares(
544
+ asset_amount_wei, web3
545
+ )
546
+
547
+ # If we have enough shares, we don't need to deposit.
548
+ if collateral_token_balance_in_shares >= asset_amount_wei_in_shares:
549
+ return
550
+
551
+ # If we need to deposit into erc4626, we first need to have enough of the asset token.
552
+ asset_token_contract = collateral_token_contract.get_asset_token_contract(web3=web3)
553
+
554
+ # If the asset token is Depositable Wrapper ERC-20, we can deposit it, in case we don't have enough.
555
+ if (
556
+ collateral_token_contract.get_asset_token_balance(for_address, web3)
557
+ < asset_amount_wei
558
+ ):
559
+ if isinstance(asset_token_contract, ContractDepositableWrapperERC20BaseClass):
560
+ auto_deposit_depositable_wrapper_erc20(
561
+ asset_token_contract, asset_amount_wei, api_keys, web3
562
+ )
563
+ else:
564
+ raise ValueError(
565
+ "Not enough of the asset token, but it's not a depositable wrapper token that we can deposit automatically."
566
+ )
567
+
568
+ # Finally, we can deposit the asset token into the erc4626 vault.
569
+ collateral_token_balance_in_assets = collateral_token_contract.convertToAssets(
570
+ collateral_token_balance_in_shares, web3
571
+ )
572
+ left_to_deposit = Wei(asset_amount_wei - collateral_token_balance_in_assets)
573
+ collateral_token_contract.deposit_asset_token(left_to_deposit, api_keys, web3)
574
+
575
+
576
+ def to_gnosis_chain_contract(
577
+ contract: ContractERC20BaseClass,
578
+ ) -> ContractERC20OnGnosisChain:
579
+ if isinstance(contract, ContractERC4626BaseClass):
580
+ return ContractERC4626OnGnosisChain(address=contract.address)
581
+ elif isinstance(contract, ContractDepositableWrapperERC20BaseClass):
582
+ return ContractDepositableWrapperERC20OnGnosisChain(address=contract.address)
583
+ elif isinstance(contract, ContractERC20BaseClass):
584
+ return ContractERC20OnGnosisChain(address=contract.address)
585
+ else:
586
+ raise ValueError("Unsupported contract type")
587
+
588
+
589
+ def create_contract_method_cache_key(
590
+ method: t.Callable[[t.Any], t.Any], web3: Web3
591
+ ) -> str:
592
+ return f"{method.__name__}-{str(web3.provider)}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prediction-market-agent-tooling
3
- Version: 0.43.2
3
+ Version: 0.44.0
4
4
  Summary: Tools to benchmark, deploy and monitor prediction market agents.
5
5
  Author: Gnosis
6
6
  Requires-Python: >=3.10,<3.12
@@ -1,4 +1,6 @@
1
- prediction_market_agent_tooling/abis/erc20.abi.json,sha256=jdWxiSALAJEwvIWE8VLNs82hnxl9UGWNyw80CNeS8ic,5461
1
+ prediction_market_agent_tooling/abis/depositablewrapper_erc20.abi.json,sha256=m0Wk3uQyLM8apWRRvX4d3u1d77bWVuXfV38D-aV48t0,4612
2
+ prediction_market_agent_tooling/abis/erc20.abi.json,sha256=b8t6tPUhjBo5dHFq8ipsK-ih_g29dOTbWI0GBZiEWL8,3685
3
+ prediction_market_agent_tooling/abis/erc4626.abi.json,sha256=qvmonhj3tJU5flR4pJjXCSSwB8tgEiJcx4Sc5ilQ5VY,17801
2
4
  prediction_market_agent_tooling/abis/omen_dxdao.abi.json,sha256=Z1kD1QfgYfGwsZEI2UFDNEGZ4hMOix3HGICk8xlO4Ds,9578
3
5
  prediction_market_agent_tooling/abis/omen_fpmm.abi.json,sha256=CDib_b5PVj4m0JBVCB20cTshiVx8st1Be-7E460qFoY,11406
4
6
  prediction_market_agent_tooling/abis/omen_fpmm_conditionaltokens.abi.json,sha256=ux30hTxtZiOZ86FsTEK8Xnm910iyjB1CFnkXrCbhfm8,9841
@@ -7,7 +9,7 @@ prediction_market_agent_tooling/abis/omen_kleros.abi.json,sha256=QPMXrYA5UCo_wVU
7
9
  prediction_market_agent_tooling/abis/omen_oracle.abi.json,sha256=YPZ-FLvd4PA9pYd6d5mQI1TD11JnsE0LGxH4XcZZFCA,1775
8
10
  prediction_market_agent_tooling/abis/omen_realitio.abi.json,sha256=7HmFkBF_rq83UTaH2kRRsEfc_WZuf4n-qvkB4nhvweo,15953
9
11
  prediction_market_agent_tooling/abis/omen_thumbnailmapping.abi.json,sha256=u1-3B8FB3Ys9KVJCH-lw9ArkicdxbNMf34dV-VEGMMU,930
10
- prediction_market_agent_tooling/abis/wxdai.abi.json,sha256=m3qC06Yug-pToI0lSFe1f8e6gKMIulnV3MA2K0X51hI,6055
12
+ prediction_market_agent_tooling/abis/proxy.abi.json,sha256=h24GXZ6Q0bSZlwh7zOv0EiDvbqUz_PHtWfKHTyPJ1w4,644
11
13
  prediction_market_agent_tooling/benchmark/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
14
  prediction_market_agent_tooling/benchmark/agents.py,sha256=HPIFJvackW110ch3UkktbxhU48gMRVo4gQse84Klhdc,4000
13
15
  prediction_market_agent_tooling/benchmark/benchmark.py,sha256=xiHKzZx5GHSsDerFHMZ9j_LXAXnSaITSvv67iPe3MEU,21095
@@ -19,30 +21,30 @@ prediction_market_agent_tooling/deploy/constants.py,sha256=M5ty8URipYMGe_G-RzxRy
19
21
  prediction_market_agent_tooling/deploy/gcp/deploy.py,sha256=CYUgnfy-9XVk04kkxA_5yp0GE9Mw5caYqlFUZQ2j3ks,3739
20
22
  prediction_market_agent_tooling/deploy/gcp/kubernetes_models.py,sha256=qYIHRxQLac3yxtZ8ChikiPG9O1aUQucHW0muTSm1nto,2627
21
23
  prediction_market_agent_tooling/deploy/gcp/utils.py,sha256=oyW0jgrUT2Tr49c7GlpcMsYNQjoCSOcWis3q-MmVAhU,6089
22
- prediction_market_agent_tooling/gtypes.py,sha256=lbV2nsPyhMIRI9olx0_6A06jwTWKYBPGMxyiGVFysag,2467
24
+ prediction_market_agent_tooling/gtypes.py,sha256=ezM2iAycTRJ0uHKK03s0z76a8YFSF438kjOwT_BAqz4,2474
23
25
  prediction_market_agent_tooling/loggers.py,sha256=ua9rynYmsbOJZjxPIFxRBooomeN08zuLSJ7lxZMDS7w,3133
24
- prediction_market_agent_tooling/markets/agent_market.py,sha256=4xMZSiNdr5NiJxuPWqhA6tnl4VloAxSpLvQdY7ySwAA,8393
26
+ prediction_market_agent_tooling/markets/agent_market.py,sha256=BELq6x3F4xLZwi0XmoN84RA7ttRQIclyHL2CY6a4Ixc,8409
25
27
  prediction_market_agent_tooling/markets/categorize.py,sha256=HyKSFHXPL7Hfe90ahbF7xszamYREUVrPkLcpifw1V9Y,935
26
28
  prediction_market_agent_tooling/markets/data_models.py,sha256=qD0LyFkzimaMkDVE0QO2a4I9fQ8qpO2qPmVzb-0JBik,2085
27
29
  prediction_market_agent_tooling/markets/manifold/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
30
  prediction_market_agent_tooling/markets/manifold/api.py,sha256=AC2zmkzpBU3P4kyybs7CgPbDg4hLAx3GY5mjgDi7qDo,7221
29
31
  prediction_market_agent_tooling/markets/manifold/data_models.py,sha256=jHqOzOiN21wYvDNyh4VtbGtj4adWr6vA4liOQmh24cc,6239
30
- prediction_market_agent_tooling/markets/manifold/manifold.py,sha256=ai82Ozzx-BdtIDvORmepODh3S-EeyAvYBQyQUEarMLg,4179
32
+ prediction_market_agent_tooling/markets/manifold/manifold.py,sha256=7vLi3KT-Qqq523gb4AZxgbvuB0deSqS5KQYiLwCiMl4,4194
31
33
  prediction_market_agent_tooling/markets/manifold/utils.py,sha256=cPPFWXm3vCYH1jy7_ctJZuQH9ZDaPL4_AgAYzGWkoow,513
32
34
  prediction_market_agent_tooling/markets/markets.py,sha256=Hz3E7LJ5HIjCHQtdU5_Bymav2dYT0dDxKOL0i8mV0mg,3142
33
35
  prediction_market_agent_tooling/markets/metaculus/api.py,sha256=gvPQVAM5NlCyWzEMt4WML9saRBsK9eiHAZP6jwirVqc,2750
34
36
  prediction_market_agent_tooling/markets/metaculus/data_models.py,sha256=6TBy17xntdLBR61QCE5wddwTa_k2D0D8ZgK6p7sGUuc,2448
35
37
  prediction_market_agent_tooling/markets/metaculus/metaculus.py,sha256=uNF7LP4evvubk818g2zbX1VlnFxeUQOkNgx_e_LwaJA,3416
36
38
  prediction_market_agent_tooling/markets/omen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- prediction_market_agent_tooling/markets/omen/data_models.py,sha256=oY-5wvFR4lXaTsmXVKrqrAQ8TWd-mAHLaxI1ETatLOc,14477
38
- prediction_market_agent_tooling/markets/omen/omen.py,sha256=GSuUP8gjFKy6zp2dfq5AGlzu5T7B08cFdjjlw07rSdU,39114
39
- prediction_market_agent_tooling/markets/omen/omen_contracts.py,sha256=JGXCO9MIVr-DGyoH2sxReAw7ZDTC_ev0UxDpq1QBv5Q,21854
40
- prediction_market_agent_tooling/markets/omen/omen_resolving.py,sha256=kXXU-tir6Bwvgrc7P9nX4hZELahI79DoJy_7DMAoe4M,9035
41
- prediction_market_agent_tooling/markets/omen/omen_subgraph_handler.py,sha256=kDbeZ8ImLtBSFz0GoGdCqeC1Xd3_eGMAxvmLFT8kp8Y,25222
39
+ prediction_market_agent_tooling/markets/omen/data_models.py,sha256=fpYxaslKq48lpNDsFUHcggY5geZIAKWDfC9FwUgIstE,14539
40
+ prediction_market_agent_tooling/markets/omen/omen.py,sha256=7n-UwtXVKVqbZoJhRGDPlsYPyHcdMGuiJpJCaQMsG3A,39488
41
+ prediction_market_agent_tooling/markets/omen/omen_contracts.py,sha256=FZCbzTuVUI-8NvbB2BDRP0xtkDY5pdCxpVuQ0nnQLdI,22618
42
+ prediction_market_agent_tooling/markets/omen/omen_resolving.py,sha256=tXTJM_HNefODAJSGU_w1OklZ457ZMAjL6dC0EvkUYQ8,9450
43
+ prediction_market_agent_tooling/markets/omen/omen_subgraph_handler.py,sha256=4F4QR8MDwyEw52rolEJNxtbCcIipX6ccNHANfWyCBjg,25945
42
44
  prediction_market_agent_tooling/markets/polymarket/api.py,sha256=HXmA1akA0qDj0m3e-GEvWG8x75pm6BX4H7YJPQcST7I,4767
43
45
  prediction_market_agent_tooling/markets/polymarket/data_models.py,sha256=9CJzakyEcsn6DQBK2nOXjOMzTZBLAmK_KqevXvW17DI,4292
44
46
  prediction_market_agent_tooling/markets/polymarket/data_models_web.py,sha256=yK0uxLQrwImVAXbvwscdmxTjSxMpAjCcN760EWEK_8M,11914
45
- prediction_market_agent_tooling/markets/polymarket/polymarket.py,sha256=xGJejGYoDbLBfXabhOI85ZMNnAMsWTedCCPKP6KfGno,2721
47
+ prediction_market_agent_tooling/markets/polymarket/polymarket.py,sha256=f7r79fAhLzwS22urfuhVW1Si2m2pZrr5r45WNt-Q3VU,2737
46
48
  prediction_market_agent_tooling/markets/polymarket/utils.py,sha256=m4JG6WULh5epCJt4XBMHg0ae5NoVhqlOvAl0A7DR9iM,2023
47
49
  prediction_market_agent_tooling/monitor/langfuse/langfuse_wrapper.py,sha256=b6T69YB1x8kSUvW9uRFuSWPLOrXzapZG7m5O5SU0QTQ,895
48
50
  prediction_market_agent_tooling/monitor/markets/manifold.py,sha256=GdYpgRX1GahDi-75Mr53jgtEg6nWcs_rHDUkg4o_7dQ,3352
@@ -59,7 +61,7 @@ prediction_market_agent_tooling/tools/betting_strategies/market_moving.py,sha256
59
61
  prediction_market_agent_tooling/tools/betting_strategies/minimum_bet_to_win.py,sha256=-FUSuQQgjcWSSnoFxnlAyTeilY6raJABJVM2QKkFqAY,438
60
62
  prediction_market_agent_tooling/tools/betting_strategies/stretch_bet_between.py,sha256=THMXwFlskvzbjnX_OiYtDSzI8XVFyULWfP2525_9UGc,429
61
63
  prediction_market_agent_tooling/tools/cache.py,sha256=tGHHd9HCiE_hCCtPtloHZQdDfBuiow9YsqJNYi2Tx_0,499
62
- prediction_market_agent_tooling/tools/contract.py,sha256=fWYQAJhLLBasEJCiJqZEiXOgJ3dO9Mknppdsd1gHchc,6999
64
+ prediction_market_agent_tooling/tools/contract.py,sha256=d6eR1CSSKRxyM-zgUtp5jmj3z8nAfwTdtiTGWjzlvYU,19388
63
65
  prediction_market_agent_tooling/tools/costs.py,sha256=EaAJ7v9laD4VEV3d8B44M4u3_oEO_H16jRVCdoZ93Uw,954
64
66
  prediction_market_agent_tooling/tools/gnosis_rpc.py,sha256=_MYSoyOR2MgAJkop1ERf8RhLum-M8S6OjaAsaqUW41w,203
65
67
  prediction_market_agent_tooling/tools/google.py,sha256=SfVDxb3oEOUK8mpd0l3mTX9ybrdrTPNM6HjfJ7kfNjA,1794
@@ -73,8 +75,8 @@ prediction_market_agent_tooling/tools/singleton.py,sha256=CiIELUiI-OeS7U7eeHEt0r
73
75
  prediction_market_agent_tooling/tools/streamlit_user_login.py,sha256=NXEqfjT9Lc9QtliwSGRASIz1opjQ7Btme43H4qJbzgE,3010
74
76
  prediction_market_agent_tooling/tools/utils.py,sha256=JE9YWtPPhnTgLiOyGAZDNG5K8nCwUY9IZEuAlm9UcxA,6611
75
77
  prediction_market_agent_tooling/tools/web3_utils.py,sha256=nKRHmdLnWSKd3wpo-cysXGvhhrJ2Yf69sN2FFQfSt6s,10578
76
- prediction_market_agent_tooling-0.43.2.dist-info/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650
77
- prediction_market_agent_tooling-0.43.2.dist-info/METADATA,sha256=5Quxa1Np-dUlu07Lf34LIqKiEBIxDy3Mb2YVFq9Bd1k,7634
78
- prediction_market_agent_tooling-0.43.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
79
- prediction_market_agent_tooling-0.43.2.dist-info/entry_points.txt,sha256=m8PukHbeH5g0IAAmOf_1Ahm-sGAMdhSSRQmwtpmi2s8,81
80
- prediction_market_agent_tooling-0.43.2.dist-info/RECORD,,
78
+ prediction_market_agent_tooling-0.44.0.dist-info/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650
79
+ prediction_market_agent_tooling-0.44.0.dist-info/METADATA,sha256=uEMgSr-fSEh1CWW385kM1dmHFcmhPX5u_BcLj0NETvM,7634
80
+ prediction_market_agent_tooling-0.44.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
81
+ prediction_market_agent_tooling-0.44.0.dist-info/entry_points.txt,sha256=m8PukHbeH5g0IAAmOf_1Ahm-sGAMdhSSRQmwtpmi2s8,81
82
+ prediction_market_agent_tooling-0.44.0.dist-info/RECORD,,