
     j+                         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rSrS\S\4S	 jrSS
KJrJr  SSKJrJrJr   " S S5      rg)u  
V12 — Executor: taker orders para momentum.

Live mode:
  - GTC aggressive limit (al ask + AGGRESSIVE_BUMP) — V12: reducido de +0.02 a +0.01
  - Verificación de fill vía CLOB get_trades API (V12: reemplaza positions API rota)
  - Balance check antes de operar (on-chain via Polygon RPC, no necesita tunnel)
  - Cancel de órdenes pendientes si no se llenan

V12 fix crítico: verify_fill usa client.get_trades(asset_id) en vez de
data-api.polymarket.com/positions. La positions API tiene latencia de minutos
y nunca muestra fills recientes, causando que TODOS los trades caigan al path
FILL TRUST (que creaba trades fantasma). get_trades devuelve fills CONFIRMED
con transaction_hash — es la fuente de verdad on-chain.
    N   )ConfigHOSTCHAIN_ID
MIN_SHARESPAPER_SLIPPAGE
snap_price*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)u   Lee el balance pUSD on-chain via Polygon RPC (decimals=6).
No necesita el tunnel SSH — va directo a Polygon, no a Polymarket.
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/Poly/v12/executor.py_pusd_balancer-      s     '!"+++-33B77DNN;
($7B!.
  ffhll8U+%(SD[s3|c!AcA s   A#B B 
BB)
ClobClientSide)ApiCredsOrderArgsV2TradeParamsc                       \ 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\S\S-  4S j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 [])r6   client_balance_cache_balance_tsliveosgetenvstripreplacer0   r.   r   r   get_balanceprintassetupper)selfr6   pkproxyrD   bals         r,   __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:   r9   r    )
r6   rK   rH   timerJ   rI   rL   rM   rN   r-   )rT   r[   rV   rW   s       r,   rP   Executor.get_balanceF   s}    xx}}DKK$))+(8(88B>&&&		,+113&+mE"!99;
rZ   token_idpricesizelabelc                    [        U5      n[        [        US5      [        5      nU R                  R
                  (       a  U R                  (       d[  [        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XeS4$ X#-  nU R                  5       nXS-  :  a  [        SU SUS SUS S35        g[        X R                  R                  -   5      n	 [        UU	USS9n
U R                  R                  U
SS9n[        U[         5      (       a  SUS.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 ;   ab  ['        UR#                  S!5      =(       d    S"5      nUS":  a  UOUn[        S#U SU	S S$US	 S%[!        U5      S&S'  S(3	5        S[!        U5      U	S4$ US);   a8  [        S*U SU	S S$US	 S+U S,[!        U5      S&S'  S(35        S[!        U5      U	S-4$ [        S.U S/U=(       d    U=(       d    U 35        g0! [(         a'  n[        S1U S/[!        U5      S&S2  35         S&nAg0S&nAff = f)3z
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 = $Tmatchedg?z  [TAKE SKIP] z: balance $z	 < cost $z	 + margen)Fr9   r    BUY)r`   ra   rb   sideGTC)
order_args
order_type)successorderIDrm   Frn   order_idr9   errorMsg	error_msgstatus)rg   filledtakingAmountr   z  [TAKE FILLED] z x z
 sh | oid=N   z...)rK   openz  [TAKE PENDING] z sh | status=z | oid=pendingz  [TAKE FAIL] : )Fr9   r    r9   z  [TAKE ERR] P   )r	   maxroundr   r6   rK   rH   r   r(   r^   rQ   rP   aggressive_bumpr1   create_and_post_order
isinstancestrr'   r!   floatr)   )rT   r`   ra   rb   rc   
fill_priceoidcostrW   aggressive_priceargsresprm   err_msgrr   takingactual_sizees                     r,   place_taker_orderExecutor.place_taker_orderS   s    5!E$NJ/xx}}DKK#EN$:;J3tyy{+,AeW5COE7#j-=VE#; OCj
(9#'>@ A)33 | N5'SI >*I/ 0! &ehh.F.F&FG(	&!&	D ;;44  5 D $$$#'D9hhy%0Ghhy)GTXXj-AGRChhz*Idhh{.CIrGxx)/R668F&$99txx7<1=(.
f(s3CC2H I&s+:c#hsm_CI JSX'7BB++)%4DS3I J*M& : Xcr]O30 1 SX'7BBugR0I60IT/JKL) 	&M%3q6#2;-89%	&s%   EJ2 =J2 #J2 2
K#<KK#order_tsNc                    U R                   R                  (       a  U R                  (       d  g[        R                  " SS5      R                  5       R                  5       nU(       d  gUS:  a  US-
  O [        [        R                  " 5       5      S-
  n U R                  R                  [        US9SS	9nSnSn	/ n
U GH  nUR                  S5      =(       d    SR                  5       nUS:w  a  M4  UR                  SS5      R                  5       U:X  a  UR                  S5      S:X  a  [        UR                  SS5      5      U:X  aw  [!        UR                  SS5      5      n[!        UR                  SS5      5      nUS:  a;  US:  a5  X-  nXU-  -  n	UR                  SS5      nU(       a  U
R#                  U5        UR                  S/ 5       H  nUR                  SS5      R                  5       U:w  a  M)  [        UR                  SS5      5      nUU:w  a  ML  [!        UR                  SS5      5      n[!        UR                  SS5      5      nUS:  d  M  US:  d  M  X-  nXU-  -  n	UR                  SS5      nU(       d  M  X;  d  M  U
R#                  U5        M     GM     US::  a  gUS:  a  [%        X-  S5      OSn[%        US5      UU
S.$ ! [         a  n[        S
U 35         SnAgSnAff = f)a  Verify fill via CLOB get_trades API.

Busca trades CONFIRMED donde nuestra address aparece como maker
en maker_orders para el asset_id dado, desde order_ts en adelante.

Returns {"size": float, "avg_price": float, "tx_hashes": list} or None.

V12: Reemplaza la positions API (data-api.polymarket.com/positions)
que tiene latencia de minutos y nunca mostraba fills recientes,
causando trades fantasma via FILL TRUST.
Nr:   r9   r   <   x   )afterT)only_first_pagez  [verify] get_trades error: r    rr   	CONFIRMEDmaker_addresstrader_sideTAKERasset_idrb   ra   transaction_hashmaker_ordersmatched_amount      )rb   	avg_price	tx_hashes)r6   rK   rH   rL   rM   rN   r!   r(   r^   
get_tradesr2   r)   rQ   r'   rS   r   r   appendr{   )rT   sessionr`   r   rV   after_tstradesr   
total_sizeweighted_pricer   trr   szpxtx_hmomo_assetr   s                      r,   verify_fillExecutor.verify_fill   s    xx}}DKK		,+11399; '/lHrMTYY[9IC9O
	[[++(+ $ , F 
	AeeHo+224F$ or*002e;m,7AEE*b12h>155+,155!,-6b1f$J"2g-N55!3R8D!((. eeNB/66/2.446%?rvvj"56x'266"2A67266'1-.6b1f$J"2g-N55!3R8Dt 5!((. 0' D ?=G!^E.5q9QR	*a(""
 	
_  	1!56	s   !K 
K<$K77K<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] ru   rx   r   )r6   rK   rH   cancel_orderr~   r   r!   dictr'   r)   rQ   )rT   ro   r   	cancelledr   errs         r,   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   )r6   rK   rH   
cancel_allr~   r   r'   listlenrQ   r)   r   )rT   r   r   nr   s        r,   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)rI   rJ   r6   rH   )F)r   )__name__
__module____qualname____firstlineno__r   rX   boolr   rP   r   tupler   r(   r   r   r   r   __static_attributes__ rZ   r,   r4   r4   +   s    EF E4	T 	e 	E&# E&e E&5 E&!$E&).tS%/?)@E&T %&Q
S Q
!Q
*.+Q
jS T *C rZ   r4   )__doc__rL   r^   requestsr#   configr   r   r   r   r   r	   r&   r%   r   r   r-   py_clob_client_v2r.   r/   py_clob_client_v2.clob_typesr0   r1   r2   r4   r   rZ   r,   <module>r      sN      R R ;
63 5  / K Kg grZ   