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.
- prediction_market_agent_tooling/abis/depositablewrapper_erc20.abi.json +279 -0
- prediction_market_agent_tooling/abis/erc20.abi.json +221 -314
- prediction_market_agent_tooling/abis/erc4626.abi.json +623 -0
- prediction_market_agent_tooling/abis/proxy.abi.json +24 -0
- prediction_market_agent_tooling/gtypes.py +1 -1
- prediction_market_agent_tooling/markets/agent_market.py +2 -1
- prediction_market_agent_tooling/markets/manifold/manifold.py +3 -2
- prediction_market_agent_tooling/markets/omen/data_models.py +2 -1
- prediction_market_agent_tooling/markets/omen/omen.py +81 -62
- prediction_market_agent_tooling/markets/omen/omen_contracts.py +37 -12
- prediction_market_agent_tooling/markets/omen/omen_resolving.py +15 -5
- prediction_market_agent_tooling/markets/omen/omen_subgraph_handler.py +15 -0
- prediction_market_agent_tooling/markets/polymarket/polymarket.py +2 -1
- prediction_market_agent_tooling/tools/contract.py +360 -10
- {prediction_market_agent_tooling-0.43.2.dist-info → prediction_market_agent_tooling-0.44.0.dist-info}/METADATA +1 -1
- {prediction_market_agent_tooling-0.43.2.dist-info → prediction_market_agent_tooling-0.44.0.dist-info}/RECORD +19 -17
- prediction_market_agent_tooling/abis/wxdai.abi.json +0 -279
- {prediction_market_agent_tooling-0.43.2.dist-info → prediction_market_agent_tooling-0.44.0.dist-info}/LICENSE +0 -0
- {prediction_market_agent_tooling-0.43.2.dist-info → prediction_market_agent_tooling-0.44.0.dist-info}/WHEEL +0 -0
- {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
|
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="
|
205
|
-
function_params=[
|
282
|
+
function_name="withdraw",
|
283
|
+
function_params=[amount_wei],
|
206
284
|
tx_params=tx_params,
|
207
285
|
web3=web3,
|
208
286
|
)
|
209
287
|
|
210
|
-
|
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=[
|
335
|
+
function_params=[assets_wei, receiver, owner],
|
221
336
|
tx_params=tx_params,
|
222
337
|
web3=web3,
|
223
338
|
)
|
224
339
|
|
225
|
-
def
|
226
|
-
|
227
|
-
return
|
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,4 +1,6 @@
|
|
1
|
-
prediction_market_agent_tooling/abis/
|
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/
|
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=
|
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=
|
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=
|
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=
|
38
|
-
prediction_market_agent_tooling/markets/omen/omen.py,sha256=
|
39
|
-
prediction_market_agent_tooling/markets/omen/omen_contracts.py,sha256=
|
40
|
-
prediction_market_agent_tooling/markets/omen/omen_resolving.py,sha256=
|
41
|
-
prediction_market_agent_tooling/markets/omen/omen_subgraph_handler.py,sha256=
|
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=
|
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=
|
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.
|
77
|
-
prediction_market_agent_tooling-0.
|
78
|
-
prediction_market_agent_tooling-0.
|
79
|
-
prediction_market_agent_tooling-0.
|
80
|
-
prediction_market_agent_tooling-0.
|
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,,
|