a
    ö³bjJ  ã                   @   sÜ  U d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlZddlmZ ddlmZ ddlmZ edƒ d	Zd
Ze d¡Ze d¡Zdae
e ed< dd„ Zedœdd„Zd3eedœdd„Zd4eeeedœdd„Zd5ee
e edœdd„Z edœdd„Z!edœd d!„Z"edœd"d#„Z#e$d$k�rØe%d%ƒ e%d&e› �ƒ e%d'ƒ eƒ Z&e%d(e&d) dd*… › d+�ƒ e%d,ƒ e!ƒ Z'e%d-ej(e'd.d/�› �ƒ e%d0ƒ e"ƒ Z)e%d-e*e)e+ƒ�rÄe,e)ƒne)› d1�ƒ e%d2ƒ dS )6uè  
Polymarket CLOB API â€” authentication (Phase 1, read-only).

Derives L2 API credentials (key/secret/passphrase) from the L1 wallet private
key via an EIP-712 signed request, then verifies with read-only balance and
position checks. No orders placed here â€” that's poly_trader.py (Phase 2).

Auth scheme (Polymarket CLOB):
  L1 (wallet-signed): EIP-712 signature over a ClobAuth message, sent to
    GET /auth/derive-api-key to deterministically derive (not create) the
    account's standing API key/secret/passphrase.
  L2 (HMAC): subsequent requests sign `timestamp+method+path+body` with the
    derived secret (HMAC-SHA256, base64url), sent as POLY_SIGNATURE alongside
    POLY_API_KEY / POLY_PASSPHRASE / POLY_ADDRESS / POLY_TIMESTAMP.
é    N)ÚPath)ÚOptional)Úload_dotenv)ÚAccount)Úencode_typed_datazE:\soccer\.envzhttps://clob.polymarket.comé‰   ZPOLY_PRIVATE_KEYZPOLY_WALLET_ADDRESSÚ_creds_cachec                   C   s   t stdƒ‚t t ¡S )Nz POLY_PRIVATE_KEY not set in .env)ÚPRIVATE_KEYÚRuntimeErrorr   Zfrom_key© r   r   úE:\soccer\main\poly_auth.pyÚ_account)   s    r   )Úreturnc                  C   s¾   t ƒ } ttt ¡ ƒƒ}d}dddœdddœdddœgdddœd	ddœd
ddœdddœgdœdddtdœ| j||ddœdœ}t|d�}|  |¡}|j 	¡ }| 
d¡sªd| }| j||t|ƒdœS )z=EIP-712 sign a ClobAuth message; returns the L1 auth headers.r   ÚnameÚstring)r   ÚtypeÚversionÚchainIdZuint256ÚaddressÚ	timestampÚnonceÚmessage)ZEIP712DomainÚClobAuthr   ZClobAuthDomainÚ1)r   r   r   z4This message attests that I control the given wallet)r   r   r   r   )ÚtypesZprimaryTypeZdomainr   )Zfull_messageZ0x)ÚPOLY_ADDRESSÚPOLY_SIGNATUREÚPOLY_TIMESTAMPZ
POLY_NONCE)r   ÚstrÚintÚtimeÚCHAIN_IDr   r   Zsign_messageZ	signatureÚhexÚ
startswith)ZacctÚtsr   Z
typed_dataZsignableZsignedÚsigr   r   r   Ú_l1_headers/   s>    ýüú
üð



ür&   F)Úforcer   c                 C   s^   t dur| st S tƒ }tjt› d�|dd�}|jdkrNtd|j› d|j› �ƒ‚| ¡ }|a |S )uM   GET /auth/derive-api-key â€” L1-signed, returns {apiKey, secret, passphrase}.Nz/auth/derive-api-keyé   )ÚheadersÚtimeoutéÈ   zderive-api-key -> ú: )	r   r&   ÚrequestsÚgetÚ	CLOB_BASEÚstatus_coder
   ÚtextÚjson)r'   r)   ÚrÚcredsr   r   r   Úderive_api_credsX   s    
r5   Ú )ÚmethodÚpathÚbodyr   c           
      C   s†   t ƒ }tptƒ j}ttt ¡ ƒƒ}||  ¡  | | }t 	|d ¡}t
 || d¡tj¡ ¡ }t |¡ d¡}	||d |d ||	dœS )NZsecretzutf-8ÚapiKeyZ
passphrase)r   ZPOLY_API_KEYZPOLY_PASSPHRASEr   r   )r5   ÚWALLET_ADDRESSr   r   r   r   r    ÚupperÚbase64Zurlsafe_b64decodeÚhmacÚnewÚencodeÚhashlibZsha256ZdigestZurlsafe_b64encodeÚdecode)
r7   r8   r9   r4   Zacct_addressr$   ÚmsgZsecret_bytesr%   Zsig_b64r   r   r   Ú_l2_headersf   s    ûrD   )r8   Úparamsr   c                 C   sP   t d| ƒ}tjt|  ||dd�}|jdkrHtd| › d|j› d|j› �ƒ‚| ¡ S )NZGETr(   )r)   rE   r*   r+   zGET z -> r,   )rD   r-   r.   r/   r0   r
   r1   r2   )r8   rE   r)   r3   r   r   r   Ú_getw   s
    

rF   c                   C   s   t dddid�S )uJ   GET /balance-allowance â€” collateral (USDC) balance + exchange allowance.z/balance-allowanceZ
asset_typeZ
COLLATERAL)rE   ©rF   r   r   r   r   Úget_balance_allowance   s    rH   c                   C   s   t dƒS )Nz/ordersrG   r   r   r   r   Úget_open_orders„   s    rI   c                   C   s   t dƒS )Nz/tradesrG   r   r   r   r   Ú
get_tradesˆ   s    rJ   Ú__main__z&=== Phase 1: Polymarket auth check ===zWallet: z6
[1/3] Deriving API credentials (L1 signed request)...u     OK â€” apiKey: r:   é   z...z8
[2/3] Checking balance/allowance (L2 signed request)...z  é   )Úindentz
[3/3] Checking open orders...z open ordersu:   
Phase 1 OK â€” read-only auth verified. No orders placed.)F)r6   )N)-Ú__doc__Úosr    r2   r=   r>   rA   Úpathlibr   Útypingr   r-   Zdotenvr   Zeth_accountr   Zeth_account.messagesr   r/   r!   Úgetenvr	   r;   r   ÚdictÚ__annotations__r   r&   Úboolr5   r   rD   rF   rH   rI   rJ   Ú__name__Úprintr4   ZbalÚdumpsZordersÚ
isinstanceÚlistÚlenr   r   r   r   Ú<module>   sN   

)
$