
    nd$j)                     x    S 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  SSKJrJrJr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
  - 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)
ClobClient)ApiCredsOrderArgsV2TradeParamsBalanceAllowanceParams	AssetTypeOrderPayloadc                       \ 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                  (       Ga  [
        R                  " SS5      R                  5       R                  SS5      n[
        R                  " SS5      R                  5       n[        [
        R                  " SS5      5      n[        [
        R                  " S5      [
        R                  " S	5      [
        R                  " S
5      S9n[        [        [        UXTU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 )N        PK 0x
POLY_PROXYPOLY_SIG_TYPE2POLY_API_KEYPOLY_API_SECRETPOLY_API_PASSPHRASE)api_key
api_secretapi_passphrase)hostchain_idkeycredssignature_typefunderz[*] Executor TAKER LIVE [z
] | proxy=z | balance=$z.4fz[*] Executor TAKER PAPER [])r   client_balance_cache_balance_tsliveosgetenvstripreplaceintr   r
   r   r   get_balanceprintassetupper)selfr   pkproxysig_typer&   bals          &/var/www/html/Poly/V15/v15/executor.py__init__Executor.__init__   s(   !!888yyr*002::4DByyr288:E299_c:;H		.199%67!yy)>?E
 %H"UDK ""$C-ciioo.?-@ A 'c#Y8 9 .syy/@.ACD    	use_cachereturnc                    U R                   R                  (       a  U R                  (       d  gU(       a2  [        R                  " 5       U R                  -
  S:  a  U R
                  $  U R                  R                  [        [        R                  S95      n[        UR                  SS5      5      S-  nX0l        [        R                  " 5       U l        U$ ! [         a    U R
                  n N:f = f)Ng    @   )
asset_typebalancer   g    .A)r   r-   r*   timer,   r+   get_balance_allowancer   r   
COLLATERALr2   get	Exception)r7   r@   rr;   s       r<   r3   Executor.get_balance6   s    xx}}DKK$))+(8(88B>&&&	&11&)2F2FGA aeeIq)*S0C "99;
	  	&%%C	&s   (AC C10C1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.
   paper__z  [PAPER TAKE] z @ z.2fz (ask=z) x z.1fz sh = $Tmatchedg?z  [TAKE SKIP] z: balance $z	 < cost $z	 + margen)Fr   r   BUY)rM   rN   rO   sideGTC)
order_args
order_type)successorderIDr[   Fr\   order_idr   errorMsg	error_msgstatus)rU   filledtakingAmountr   z  [TAKE FILLED] z x z
 sh | oid=N   z...)r-   openz  [TAKE PENDING] z sh | status=z | oid=pendingz  [TAKE FAIL] : )Fr   r   r   z  [TAKE ERR] x   )r	   maxroundr   r   r-   r*   r   r2   rF   r4   r3   aggressive_bumpr   create_and_post_order
isinstancestrrI   lowerfloatrJ   )r7   rM   rN   rO   rP   
fill_priceoidcostr;   aggressive_priceargsrespr[   err_msgr`   takingactual_sizees                     r<   place_taker_orderExecutor.place_taker_orderH   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$3<.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   r   r   <   rg   )afterT)only_first_pagez  [verify] get_trades error: r   r`   	CONFIRMEDmaker_addresstrader_sideTAKERasset_idrO   rN   transaction_hashmaker_ordersmatched_amount      )rO   	avg_price	tx_hashes)r   r-   r*   r.   r/   r0   rn   r2   rF   
get_tradesr   rJ   r4   rI   r6   rm   ro   appendri   )r7   sessionrM   r|   r9   after_tstradesry   
total_sizeweighted_pricer   tr`   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<r]   c           	      <   U R                   R                  (       a  U R                  (       d  g U R                  R                  [	        US95      n[        U[        5      (       aV  UR                  S/ 5      nUR                  S0 5      nX=(       d    / ;   a  gU(       a  S[        U5      R                  5       ;   $ 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)r\   cancelednot_canceledz	not foundalreadyz  [CANCEL ERR] rc   rf   r~   F)r   r-   r*   cancel_orderr   rl   dictrI   rm   rn   rJ   r4   )r7   r]   ru   	cancellednot_cancelledry   errs          r<   r   Executor.cancel_order   s    xx}}DKK	;;++L,JKD$%% HHZ4	 $ <R0 &#m*<*B*B*DDD 	a&,,.Cc!Y#%5OHSbM?"SVCR[MBC	s$   A)B= "B= =
D%D1 DD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~   )r   r-   r*   
cancel_allrl   r   rI   listlenr4   rJ   rm   )r7   ru   r   nry   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)r+   r,   r   r*   )F)r   )__name__
__module____qualname____firstlineno__r   r=   boolro   r3   rm   tuplerz   r2   r   r   r   r   __static_attributes__ r?   r<   r   r      s    EF E6T e $E&# E&e E&5 E&!$E&).tS%/?)@E&T %&Q
S Q
!Q
*.+Q
jS T (C r?   r   )__doc__r.   rF   configr   r   r   r   r   r	   py_clob_client_v2r
   py_clob_client_v2.clob_typesr   r   r   r   r   r   r   r   r?   r<   <module>r      s.     R R ( l lr?   