
    +Li`*                        d dl mZ d dlZd dlZd dlmZmZmZ d dlmZm	Z	m
Z
 d dlZd dlmZ d dlmZ ddlmZmZmZmZmZmZ d	Zd
ZdZddZddZ G d d      ZddZddZddZy)    )annotationsN)datetime	timedeltatimezone)AnyIterableOptional)ClientResponseError)extract_ref_prices   )
BTC_PREFIXSESSION_SEC
MarketInfofloor_session_tsparse_dtslug_start_tszhttps://data-api.polymarket.comz https://gamma-api.polymarket.comzhttps://polygon.drpc.orgc                    | g S t        | t              r| S t        | t              r*	 t        j                  |       }t        |t              r|S g S g S # t        j
                  $ r g cY S w xY wN)
isinstanceliststrjsonloadsJSONDecodeError)rawvalues     2/root/polymarket_arb/analysis/safe_btc5/clients.py
_json_listr      sn    
{	#t
#s	JJsOE #5$/u7R7I ## 	I	s   A A+*A+c                F    t        | xr | j                  t                    S r   )bool
startswithr   )slugs    r   _is_btc_5m_slugr#   *   s    4455    c                      e Zd Zeeef	 	 	 	 	 	 	 	 	 ddZdddZdd	 	 	 	 	 	 	 ddZddd		 	 	 	 	 	 	 dd
Z	ddd	 	 	 	 	 	 	 	 	 ddZ
dd	 	 	 	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 	 	 ddZd dZdd	 	 	 	 	 d!dZd"dZy)#PolymarketDataClientc                x    || _         |j                  d      | _        |j                  d      | _        || _        y )N/)httprstripdata_api_base
gamma_baserpc_url)selfr)   r+   r,   r-   s        r   __init__zPolymarketDataClient.__init__/   s7     	*11#6$++C0r$   Nc                (  K   | j                   j                  ||t        j                  d            4 d {   }|j	                          |j                          d {   cd d d       d {    S 7 =7 7 	# 1 d {  7  sw Y   y xY ww)N   total)paramstimeout)r)   getaiohttpClientTimeoutraise_for_statusr   )r.   urlr4   resps       r   	_get_jsonzPolymarketDataClient._get_json;   s     99==))3 ! 
 	% 	% !!#$	% 	% 	% %	% 	% 	% 	%sV   7BA7B$A=!A9"A=%B1A;2B9A=;B=BBBBr   )offsetc                  K   | j                  | j                   d|d||d       d {   }t        |t              r|S g S 7 w)Nz/tradesfalse)user	takerOnlylimitr=   )r<   r+   r   r   )r.   saferB   r=   datas        r   fetch_trades_pagez&PolymarketDataClient.fetch_trades_pageD   sX      ^^!!"'*$ 	
 
 "$-t525
s   (AAAi'  i  )rB   	page_sizec          	       K   	 | j                  ||d       d {   }|D cg c]   }t        |j                  dd            s|" c}S 7 0c c}w # t        $ r Y nw xY wg }d}t	        |      |k  rt        ||t	        |      z
        }	 | j                  |||       d {  7  }n&# t        $ r}	|	j                  dk(  rY d }	~	ng d }	~	ww xY w|sn[|j                  |       t	        |      |k  rn;|t	        |      z  }t        j                  d       d {  7   t	        |      |k  r|D cg c]   }t        |j                  dd            s|" c}S c c}w w)Nr   rB   r=   r"      皙?)
rE   r#   r6   r
   lenminstatusextendasynciosleep)
r.   rC   rB   rF   pagerrowsr=   
page_limitexcs
             r   fetch_recent_tradesz(PolymarketDataClient.fetch_recent_tradesV   sN    	//E!/LLD#J!quuVR7H'IAJJ MJ" 		 &($i%YD	(9:J!33D
SY3ZZZ& ::$ KK4y:%c$iF--%%% $i%  Fa?1553D#EFFFs   E A AA  AA	A E A A 	AE A-E B+ $B'%B+ *E +	C4C	E C		CAE DE /E 3 EEE r1   )rF   	max_pagesc               V  K   g }d}t        |      D ]  }	 | j                  |||       d {   }|s n|j	                  |D 
cg c]#  }
t        |
j                  dd            |k\  s"|
% c}
       t        d |D              }||k  st        |      |k  r n-|t        |      z  }t        j                  d       d {     |D 
cg c]   }
t        |
j                  dd            s|
" c}
S 7 # t        $ r}	|	j                  dk(  rY d }	~	 L d }	~	ww xY wc c}
w 7 `c c}
w w)	Nr   rH   rJ   	timestampc              3  R   K   | ]  }t        |j                  d d             ! yw)rZ   r   N)intr6   ).0rS   s     r   	<genexpr>z:PolymarketDataClient.fetch_trades_since.<locals>.<genexpr>   s      BQUU;23Bs   %'rK   r"   rI   )rangerE   r
   rN   rO   r\   r6   rM   rL   rP   rQ   r#   )r.   rC   since_tsrF   rX   rT   r=   _rR   rV   rS   oldests               r   fetch_trades_sincez'PolymarketDataClient.fetch_trades_sincev   s     &(y! 	&A!33D	RX3YY
 KKDSqCk10E,F(,RSTBTBBF CI	$9c$iF--%%%	&  Fa?1553D#EFF Z& ::$ T
 &Fsz   D)C6C4C6D)#D
)D
-AD)D"
D) D$-D$1D)4C66	D?DD)DD	D)$D))rB   c          
       K   g }d}t               }	 	 | j                  | j                   d|||||dd       d {   }t        |t              r|ng }
|
s	 |S |
d   }t        |j                  dd            t        |j                  dd            t        |j                  d	d            f}||v r	 |S |j                  |       |j                  |
       t        |
      |k  r	 |S |t        |
      z  }t        j                  d
       d {    7 # t        $ r}	|	j                  dk(  rY d }	~	|S  d }	~	ww xY w7 /w)Nr   z	/activityASC)r@   startendrB   r=   sortDirectionrJ   transactionHashrI   rZ   typerK   )setr<   r+   r
   rN   r   r   r   r6   r\   addrO   rL   rP   rQ   )r.   rC   start_tsend_tsrB   rT   r=   seen_first_keysrD   rV   rR   first	first_keys                r   fetch_activity_windowz*PolymarketDataClient.fetch_activity_window   sl     &(58U!^^))*)4 $!)%!&"().
 
 &dD14rD"  GEEII/45EIIk1-.EIIfb)*I
 O+  	*KK4y5   c$iF--%%%G 
 ' ::$* ) , &sQ   E)D DD CED?ED 	D<!D70E6D77D<<E   )chunk_hoursc          
     H  K   g }t        j                  |t        j                        }t        j                  |t        j                        }t	        |      }||k  rt        ||z   |      }	|j                  | j                  |t        |j                               t        |	j                                      d {          |	}t        j                  d       d {    ||k  r|D 
cg c]   }
t        |
j                  dd            s|
" c}
S 7 Y7 8c c}
w w)Ntz)hours)rm   rn   rK   r"   rI   )r   fromtimestampr   utcr   rM   rO   rr   r\   rZ   rP   rQ   r#   r6   )r.   rC   rm   rn   rt   rT   cursorend_dtdeltanxtrS   s              r   fetch_activity_rangez)PolymarketDataClient.fetch_activity_range   s      &(''X\\B''8<<@,vofunf-CKK00 !1!1!34s}}/ 1   F--%%% vo  Fa?1553D#EFF &FsB   B=D"?D "D""D#	D"-D"1 DDD"D"D"c                   K   t        |      }	 | j                  | j                   d|        d {   }t	        |t
              r|s|S t        ||      S 7 $# t        $ r |cY S w xY ww)Nz/markets/slug/)market_skeletonr<   r,   	Exceptionr   dictparse_gamma_market)r.   r"   skeletonrD   s       r   fetch_market_by_slugz)PolymarketDataClient.fetch_market_by_slug   so     "4(	4??*;>$(PQQD $%TO!$-- R 	O	s7   A*#A AA  A*A A'$A*&A''A*   )concurrencyc                   K   t        j                  |      d fdt        j                  fd|D          d {   }t        |      S 7 w)Nc                   K   4 d {    j                  |        d {   }t        j                  d       d {    | |fcd d d       d {    S 7 O7 87 7 # 1 d {  7  sw Y   y xY ww)Ng{Gz?)r   rP   rQ   )r"   marketr.   sems     r   onez8PolymarketDataClient.fetch_markets_by_slugs.<locals>.one   sm      $ $#88>>mmD)))V|$ $ $>)$ $ $ $sf   A7AA7A"AA" AA"A7A A7A"A" A7"A4(A+)A40A7c              3  .   K   | ]  } |        y wr    )r]   r"   r   s     r   r^   z>PolymarketDataClient.fetch_markets_by_slugs.<locals>.<genexpr>   s     &CTs4y&Cs   )r"   r   returnztuple[str, MarketInfo])rP   	Semaphoregatherr   )r.   slugsr   pairsr   r   s   `   @@r   fetch_markets_by_slugsz+PolymarketDataClient.fetch_markets_by_slugs   sG      ,	$ nn&CU&CDDE{ Es   ;A AAc                  K   dd|gdd}| j                   j                  | j                  |t        j                  d            4 d {   }|j                          |j                          d {   }d d d       d {    t        t              r|j                  d      nd }t        |t              r|S d S 7 s7 M7 ?# 1 d {  7  sw Y   OxY ww)	Nz2.0eth_getTransactionReceiptr   )jsonrpcmethodr4   idr1   r2   )r   r5   result)
r)   postr-   r7   r8   r9   r   r   r   r6   )r.   tx_hashpayloadr;   rD   r   s         r   fetch_receiptz"PolymarketDataClient.fetch_receipt   s     1i	
 99>>LL))3 " 
 	% 	% !!#$D	% 	% (2$'=(#4#FD1v;t;	% %	% 	% 	% 	%sZ   A	CB?C$C3C4C8CC<CCCCCCC)
r)   zaiohttp.ClientSessionr+   r   r,   r   r-   r   r   Noner   )r:   r   r4   Optional[dict[str, Any]]r   r   )rC   r   rB   r\   r=   r\   r   list[dict[str, Any]])rC   r   rB   r\   rF   r\   r   r   )
rC   r   r`   r\   rF   r\   rX   r\   r   r   )
rC   r   rm   r\   rn   r\   rB   r\   r   r   )
rC   r   rm   r\   rn   r\   rt   r\   r   r   r"   r   r   r   )r   zIterable[str]r   r\   r   zdict[str, MarketInfo])r   r   r   r   )__name__
__module____qualname__DATA_API_BASE
GAMMA_BASEPOLYGON_RPCr/   r<   rE   rW   rc   rr   r   r   r   r   r   r$   r   r&   r&   .   s    +$"
#
 
 	

 
 

% 66 	6
 6 
6, GG 	G
 G 
GJ GG G
 G G 
GB // 	/
 / / 
/n GG 	G
 G G 
G2. 	 	
 
"<r$   r&   c                    t        |       }|%t        j                  |t        j                        nd }|,t        j                  |t
        z   t        j                        nd }t        | | ||d      S )Nrv   r   )r"   
event_slug
start_timeend_timesource)r   r   ry   r   rz   r   r   )r"   tsrf   rg   s       r   r   r     sp    	t	B;=>H""2(,,7tE > 	rK/HLLA 
  r$   c                    t        |       }t        |      }t        ||t        z   t              D cg c]  }t         |  c}S c c}w r   )r   r_   r   r   )rm   rn   rf   rg   r   s        r   generate_market_slugsr     sA    X&E
6
"C*/s[7H+*VWBzl2$WWWs   Ac                l   t        |      }t        | j                  d            xs ddg}t        | j                  d            }t        d t	        |      D        d      }t        d t	        |      D        t        |      dkD  rdnd      }t        |      |kD  rt        ||         nd	}t        |      |kD  rt        ||         nd	}t        | j                  d
            xs |j                  }	t        | j                  d            xs |j                  }
i }| j                  d      }t        |t              r:|r8t        |d   t              r|d   ni }t        |j                  d            xs |	}	t        ||       \  }}t        | j                  d            }d	}t        | j                  d            xs | j                  d      dk(  }|rit        |      t        |      k\  rR	 |D cg c]  }t        |       c}t!        t#        t                    fd      }|   dk\  rt        ||         }|s||||k\  rdnd}d}t)        || j                  d      xs || j                  dd	      | j                  dd	      |	|
||||||d      S c c}w # t$        t&        f$ r d	}Y tw xY w)NoutcomesUpDownclobTokenIdsc              3  `   K   | ]&  \  }}t        |      j                         d k(  s#| ( yw)upNr   lowerr]   ios      r   r^   z%parse_gamma_market.<locals>.<genexpr>$  s%     OAA$8N1O   $..r   c              3  `   K   | ]&  \  }}t        |      j                         d k(  s#| ( yw)downNr   r   s      r   r^   z%parse_gamma_market.<locals>.<genexpr>&  s%     Gtq!c!flln.FGr   r   rI   eventStartTimeendDateevents	startTimeoutcomePricesclosedumaResolutionStatusresolvedc                    |    S r   r   )r   pricess    r   <lambda>z$parse_gamma_market.<locals>.<lambda>>  s    F1I r$   )keyg+?T	eventSlugconditionIdquestiongamma)r"   r   condition_idtitler   r   up_token_iddown_token_idr   winning_outcomefinal_priceprice_to_beatr   )r   r   r6   next	enumeraterL   r   r   r   r   r   r   r   r   r    floatmaxr_   	TypeError
ValueErrorr   )r   r"   r   r   	token_idsup_idxdown_idxup_token
down_tokenr   r   eventr   r   r   outcome_priceswinningr   pmax_idxr   s                       @r   r   r     s   t$H#''*-.@4.H377>23IO8!4OQRSFGy*G]QAH
 *-Y&)@s9V$%bH-0^h-FYx()BJ#''"234K8K8KJ	*+@x/@/@HEWWXF&$F'q	48q	beii45C
!3E3!?M; 89NGCGGH%&V#''2G*HJ*VHC'3x=8	(671eAh7F%F,2EFGg%'hw/0 {.=3L%6$F77;'/4WW]B/ggj"% #  8 :& 	G	s$   -J 1J;J J J32J3)r   r   r   z	list[Any])r"   r   r   r    r   )rm   r\   rn   r\   r   z	list[str])r   zdict[str, Any]r"   r   r   r   )
__future__r   rP   r   r   r   r   typingr   r   r	   r7   r
   gamma_event_parser   typesr   r   r   r   r   r   r   r   r   r   r#   r&   r   r   r   r   r$   r   <module>r      se    "   2 2 * *  ' 0  2/
(6W< W<t"X7r$   