
    ji                         S r SSKrSSKrSSKrSSKJrJrJrJ	r	J
r
Jr  SSKJrJr  SSKJrJr  SSKJrJr  SrS	rS
\S\4S jr " S S5      rg)u  
V11 — Executor: taker orders para momentum.

Live mode:
  - GTC aggressive limit (al ask o above) — FOK no siempre soportado
  - Verificación de fill vía positions API
  - Balance check antes de operar
  - Cancel de órdenes pendientes si no se llenan
    N   )ConfigHOSTCHAIN_ID
MIN_SHARESPAPER_SLIPPAGE
snap_price)
ClobClientSide)BalanceAllowanceParams	AssetType)ApiCredsOrderArgsV2*0xc011a7e12a19f7b1f670d46f03b03f3342e82dfbz&https://polygon-bor-rpc.publicnode.comaddressreturnc                 :   SU SS R                  5       R                  S5      -   n [        R                  " [        SS[
        US.S/S	S
.SS9nUR                  5       R                  SS5      nU(       a  US:w  a  [        US5      S-  $ S$ ! [         a     gf = f)z8Read pUSD balance on-chain via Polygon RPC (decimals=6).
0x70a08231   N@   z2.0eth_call)todatalatestr   )jsonrpcmethodparamsid   )jsontimeoutresult0x00x   g    .A        )
lowerzfill	_requestspostPOLYGON_RPC
PUSD_TOKENr    getint	Exception)r   r   rraws       /var/www/html/v11b/executor.py_pusd_balancer3      s    '!"+++-33B77DNN;
($7B!.
  ffhll8U+%(SD[s3|c!AcA s   A#B B 
BBc                       \ rS rSrS\4S jrSS\S\4S jjrS\	S\S	\S
\	S\
\\	\4   4
S jrS\	S\S-  4S jrS\	S\4S jrS\4S jrSrg)Executor$   cfgc           	         Xl         S U l        SU l        SU l        UR                  (       a  [
        R                  " SS5      R                  5       R                  SS5      n[
        R                  " SS5      R                  5       n[        [
        R                  " S5      [
        R                  " S5      [
        R                  " S5      S	9n[        [        [        UUS
US9U l        U R                  5       n[        SUR                  R!                  5        SU SUS 35        g [        SUR                  R!                  5        S35        g )Nr&   PK r$   
POLY_PROXYPOLY_API_KEYPOLY_API_SECRETPOLY_API_PASSPHRASE)api_key
api_secretapi_passphraser   )hostchain_idkeycredssignature_typefunderz[*] Executor TAKER LIVE [z
] | proxy=z | balance=$z.4fz[*] Executor TAKER PAPER [])r7   client_balance_cache_balance_tsliveosgetenvstripreplacer   r
   r   r   get_balanceprintassetupper)selfr7   pkproxyrE   bals         r2   __init__Executor.__init__%   s   !!88IIdB'--/77bABIIlB/557E		.199%67!yy)>?E
 %H"AeDK ""$C-ciioo.?-@ A 'c#Y8 9 .syy/@.ACD    	use_cacher   c                    U R                   R                  (       a  U R                  (       d  gU(       a2  [        R                  " 5       U R                  -
  S:  a  U R
                  $ [        R                  " SS5      R                  5       nU(       a  [        U5      OSnX0l        [        R                  " 5       U l        U$ )Ng    @   r;   r:   r&   )
r7   rL   rI   timerK   rJ   rM   rN   rO   r3   )rU   r\   rW   rX   s       r2   rQ   Executor.get_balance?   s}    xx}}DKK$))+(8(88B>&&&		,+113&+mE"!99;
r[   token_idpricesizelabelc                    [        U5      n[        [        US5      [        5      nU R                  R
                  (       a  U R                  (       dZ  [        U[        -   5      nS[        [        R                  " 5       5       SU 3n[        SU SUS SUS SUS	 S
XS-  S 3
5        SXe4$ X#-  nU R                  5       nXS-  :  a  [        SU SUS SUS S35        g[        US-   5      n	 [        UU	USS9n
U R                  R                  U
SS9nUR                  SS5      nUR                  S5      =(       d    UR                  S5      =(       d    SnUR                  S5      =(       d    UR                  S5      =(       d    SnUR                  S5      =(       d    SR                  5       nU(       d  US;   a4  [        S U SU	S S!US	 S"[!        U5      S#S$  S%3	5        S[!        U5      U	4$ [        S&U S'U=(       d    U=(       d    U 35        g! ["         a'  n[        S(U S'[!        U5      S#S)  35         S#nAgS#nAff = f)*z
Place a taker BUY order at the ask price.
Returns (success, order_id, fill_price).
Paper: simulates fill at ask + slippage.
Live: GTC aggressive limit, then verify fill via positions.
r   paper__z  [PAPER TAKE] z @ z.2fz (ask=z) x z.1fz sh = $Tg?z  [TAKE SKIP] z: balance $z	 < cost $z	 + margen)Fr:   r&   g{Gz?BUY)ra   rb   rc   sideGTC)
order_args
order_typesuccessForderIDorder_idr:   errorMsg	error_msgstatus)rL   openmatchedfilledz  [TAKE SENT] z x z
 sh | oid=N   z...z  [TAKE FAIL] : z  [TAKE ERR] P   )r	   maxroundr   r7   rL   rI   r   r.   r_   rR   rQ   r   create_and_post_orderr-   r'   strr/   )rU   ra   rb   rc   rd   
fill_priceoidcostrX   aggressive_priceargsresprm   err_msgrr   es                   r2   place_taker_orderExecutor.place_taker_orderL   sd    5!E$NJ/xx}}DKK#EN$:;J3tyy{+,AeW5COE7#j-=VE#; OCj
(9#'>@ A(( | N5'SI >*I/ 0! &edl3	"!&	D ;;44  5 D
 hhy%0Ghhy)GTXXj-AGRChhz*Idhh{.CIrGxx)/R668F&$IIugS1A#0F G*Js3x}oSB C SX'777ugR0I60IT/JKL% 	"M%3q6#2;-89!	"s   /DH 4#H 
I	"II	Nc                 \   U R                   R                  (       a  U R                  (       d  g[        R                  " SS5      R                  5       nU(       d  g SU S3nUR                  USS9nUR                  5         UR                  5        H  n[        UR                  S5      =(       d    UR                  S	5      =(       d    S5      nXr:w  a  ME  [        UR                  S
5      =(       d    S5      nUS::  a  Mp  [        UR                  S5      =(       d    UR                  S5      =(       d    S5      n	U	S:X  a=  US:  a7  [        UR                  S5      =(       d    S5      n
U
S:  a  [        X-  S5      n	XS.s  $    g! [         a  n[        SU 35         SnAgSnAff = f)znCheck if we have a position for this token via data API.
Returns {"size": float, "avg_price": float} or None.
Nr;   r:   z/https://data-api.polymarket.com/positions?user=z&sizeThreshold=0.01r   )r!   rS   tokenIdrc   r   avgPrice	avg_priceinitialValue   )rc   r   z  [verify] error: )r7   rL   rI   rM   rN   rO   r-   raise_for_statusr    r|   floatrz   r/   rR   )rU   sessionra   rW   urlr0   ptidszavginitialr   s               r2   verify_fillExecutor.verify_fill   sb    xx}}DKK		,+113	,!7"57CC+A VVX!%%.BAEE),<BC?155=-A.7AEE*-H{1CHqI!8Q#AEE.$9$>Q?G{#GL!4 "55    	,&qc*++	,s   D)F	 F	 	
F+F&&F+ro   c           	         U R                   R                  (       a  U R                  (       d  g U R                  R                  U5      n[	        U[
        5      (       a-  SUR                  5       ;   =(       d    SUR                  5       ;   $ [	        U[        5      (       aR  UR                  SS5      =(       d    UR                  SS5      nU(       d  S[        U5      R                  5       ;   a  gU$ g! [         aT  n[        U5      R                  5       nSU;   d  SU;   a   S nAg[        SUS S  S	[        U5      S S
  35         S nAgS nAff = f)NTcanceledz	not foundFrm   alreadyz  [CANCEL ERR] rv   rw   <   )r7   rL   rI   cancel_order
isinstancer|   r'   dictr-   r/   rR   )rU   ro   r   	cancelledr   errs         r2   r   Executor.cancel_order   s   xx}}DKK	;;++H5D$$$!TZZ\1P[DJJL5PP$%% HHZ7U488Iu;U	 "c$ioo&77#   	a&,,.Cc!Y#%5OHSbM?"SVCR[MBC	s+   AC4 A$C4 1C4 4
E>%E( EEc                    U R                   R                  (       a  U R                  (       d  g U R                  R                  5       n[	        U[
        5      (       a  UR                  S/ 5      O/ n[	        U[        5      (       a  [        U5      OSnU(       a  [        SU S35        U$ ! [         a$  n[        S[        U5      S S  35         S nAgS nAff = f)Nr   r   z  [CANCEL ALL] z ordenes canceladasz  [CANCEL ALL ERR] r   )r7   rL   rI   
cancel_allr   r   r-   listlenrR   r/   r|   )rU   r   r   nr   s        r2   r   Executor.cancel_all   s    xx}}DKK		;;))+D4>tT4J4JR0PRI",Y"="=I1As*=>?H 	'As}56	s   A<B, ,
C6CC)rJ   rK   r7   rI   )F)__name__
__module____qualname____firstlineno__r   rY   boolr   rQ   r|   tupler   r   r   r   r.   r   __static_attributes__ r[   r2   r5   r5   $   s    EF E4	T 	e 	9"# 9"e 9"5 9"!$9").tS%/?)@9"zS TD[ BS T *C r[   r5   )__doc__rM   r_   requestsr)   configr   r   r   r   r   r	   py_clob_client_v2r
   r   r   r   py_clob_client_v2.clob_typesr   r   r,   r+   r|   r   r3   r5   r   r[   r2   <module>r      sL      R R . ? > <
73 5 g gr[   