o
    0Íiþ"  ã                   @   s,  d Z ddlZddlZddlmZ ddlmZmZ ddlZddlm	Z	 e 
e¡ZdZG dd„ dƒZed	kr”ejejd
d� eƒ Zeƒ  edƒ eƒ  e ¡  eƒ  edƒ eƒ  e ¡ Zer‹edeeƒ› d�ƒ eD ] Ze d¡rrdndZede d¡› de› de dd¡d›�ƒ qinedƒ eƒ  dS dS )u›   
Position Sync - Synchronisation positions.json avec sources on-chain
RÃ©concilie les positions locales avec les donnÃ©es rÃ©elles (The Graph + Etherscan)
é    N)Údatetime)ÚDictÚList)ÚPositionMonitorzpositions.jsonc                   @   s^   e Zd ZdZefdefdd„Zdefdd„Zdefd	d
„Z	defdd„Z
dee fdd„ZdS )ÚPositionSyncz>
    Synchronise positions.json avec les sources on-chain
    Úpositions_filec                 C   s   || _ tƒ | _d S )N)r   r   Úmonitor)Úselfr   © r
   úI/var/www/html/HyperOracle/crypto_trader/apollo_degen_bot/position_sync.pyÚ__init__   s   zPositionSync.__init__Úreturnc              
   C   sä   t j | j¡st d| j› d�¡ | jjt 	¡  
¡ i dœS z/t| jdƒ�}t |¡}W d  ƒ n1 s4w   Y  | di ¡}t dt|ƒ› d�¡ |W S  tyq } zt d	| j› d
|› �¡ | jji dœW  Y d}~S d}~ww )z'
        Charge positions.json
        u   âš ï¸�  u    n'existe pas, crÃ©ation...)ÚwalletÚlast_updatedÚ	positionsÚrNr   u   ðŸ“‚ u    positions locales chargÃ©esu   â�Œ Erreur chargement ú: )r   r   )ÚosÚpathÚexistsr   ÚloggerÚwarningr   r   r   ÚnowÚ	isoformatÚopenÚjsonÚloadÚgetÚinfoÚlenÚ	ExceptionÚerror)r	   ÚfÚdatar   Úer
   r
   r   Úload_local_positions   s$   
ýÿ€þz!PositionSync.load_local_positionsr#   c              
   C   s°   t  ¡  ¡ |d< z0t| jdƒ�}tj||dd� W d  ƒ n1 s"w   Y  t dt	| 
di ¡ƒ› d�¡ W dS  tyW } zt d	| j› d
|› �¡ W Y d}~dS d}~ww )z+
        Sauvegarde positions.json
        r   Úwé   )ÚindentNu   ðŸ’¾ r   u    positions sauvegardÃ©esu   â�Œ Erreur sauvegarde r   )r   r   r   r   r   r   Údumpr   r   r   r   r    r!   )r	   r#   r"   r$   r
   r
   r   Úsave_local_positions6   s   ÿ$&€ÿz!PositionSync.save_local_positionsc                 C   s.  t  d¡ t  d¡ t  d¡ |  ¡ }| di ¡}t  dt|ƒ› �¡ | jjdd�}t  dt|ƒ› �¡ d}d}d}t| ¡ ƒD ]›\}}| d	¡}	|	d
kr`||v }
t  d|dd… › d|
› �¡ ||v r®|| }|d	 }|	|kr­t  d|dd… › d�¡ t  d|	› d|› �¡ ||  	|| d¡| d¡|d
krŸt
 ¡  ¡ ndt
 ¡  ¡ dœ¡ |d7 }q@|	d
krÛt  d|dd… › d�¡ t  d¡ ||  	dt
 ¡  ¡ t
 ¡  ¡ dœ¡ |d7 }q@tdd„ | ¡ D ƒƒ}| ¡ D ]7\}}||v�r"t  d|dd… › d�¡ t  d|d › d |d! �rd"nd#› d$|d	 › �¡ |||< |d7 }që||d< |  |¡ t  d¡ t  d%¡ t  d¡ t  d&|› �¡ t  d'|› �¡ t  d(|› �¡ d)d*„ | ¡ D ƒ}t  d+t|ƒ› �¡ |�r�|D ]$}|d! �rtd"nd#}t  d|d › d |› d |d, › d-|d. d/›�¡ �qkt  d¡ |S )0uB  
        Synchronise positions locales avec sources on-chain

        Process:
        1. Charge positions.json locales
        2. RÃ©cupÃ¨re Ã©tat rÃ©el depuis The Graph (Arbitrum)
        3. Met Ã  jour statut des positions locales
        4. Ajoute nouvelles positions on-chain manquantes
        5. Sauvegarde
        zP================================================================================u   ðŸ”„ SYNCHRONISATION POSITIONSr   u   ðŸ“‚ Positions locales: éÈ   )Úlimitu   ðŸ”— Positions on-chain: r   ÚstatusÚOPENu"   ðŸ”� DEBUG: Position locale OPEN: Né   z | Dans onchain: u   ðŸ”„ Position z...z   Status: u    â†’ Úclose_priceÚpnl)r-   r0   r1   Ú	closed_atÚ	synced_até   z... (PAS dans onchain)u3      Status: OPEN â†’ CLOSED (n'existe plus on-chain)ÚCLOSED)r-   r2   r3   c                 s   s"   � | ]}|  d ¡dkrdV  qdS )r-   r.   r4   N©r   ©Ú.0Úpr
   r
   r   Ú	<genexpr>�   s   €  z.PositionSync.sync_positions.<locals>.<genexpr>u#   âž• Nouvelle position dÃ©couverte: ú   ÚsymbolÚ Úis_longÚLONGÚSHORTz | Status: u   ðŸ“Š RÃ‰SUMÃ‰ SYNCu   Positions mises Ã  jour: u   Positions ajoutÃ©es: zPositions actives locales: c                 S   s   g | ]
}|d  dkr|‘qS ©r-   r.   r
   r7   r
   r
   r   Ú
<listcomp>¨   s    z/PositionSync.sync_positions.<locals>.<listcomp>u    âœ… Positions actives on-chain: Úleveragezx @ $Úentry_priceú,.2f)r   r   r%   r   r   r   Úget_all_positionsÚlistÚitemsÚupdater   r   r   ÚsumÚvaluesr*   )r	   Ú
local_dataÚlocal_positionsÚonchain_positionsÚupdated_countÚadded_countÚlocal_open_countÚ
trade_hashÚ	local_posÚlocal_statusÚ
in_onchainÚonchain_posÚonchain_statusÚonchain_openÚposÚsider
   r
   r   Úsync_positionsF   s‚   




û€


ý€
2€



4
zPositionSync.sync_positionsc                 C   s:  |   ¡ }| di ¡}dd„ | ¡ D ƒ}|st d¡ g S t dt|ƒ› d�¡ g }| ¡ D ]Q\}}| j |¡}|dkrN| |¡ t d|d	d
… › d�¡ q-|rqt 	d|d	d
… › d|› d�¡ ||| d< t
 ¡  ¡ || d< q-t 	d|d	d
… › d�¡ q-t|ƒt|ƒkr�||d< |  |¡ t dt|ƒ› d�¡ |S )u_   
        VÃ©rifie uniquement les positions actives et retourne celles rÃ©ellement OPEN
        r   c                 S   s$   i | ]\}}|  d ¡dkr||“qS rA   r6   )r8   ÚthrY   r
   r
   r   Ú
<dictcomp>½   s
    ÿz8PositionSync.verify_active_positions.<locals>.<dictcomp>u"   ðŸ“Š Aucune position active localeu   ðŸ”� VÃ©rification de z positions actives...r.   u      âœ… Nr/   z... toujours OPENu      âš ï¸�  u   ... fermÃ©e (status: ú)r-   r3   u      â�“ u   ... non trouvÃ©e on-chainu   âœ… u    positions rÃ©ellement actives)r%   r   rH   r   r   r   r   Úcheck_position_statusÚappendr   r   r   r   r*   )r	   rL   rM   Ú
local_openÚverified_openrR   rS   r-   r
   r
   r   Úverify_active_positions´   s2   ÿ

 
z$PositionSync.verify_active_positionsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚPOSITIONS_FILEÚstrr   r   r%   r*   r[   r   rc   r
   r
   r
   r   r      s    nr   Ú__main__z%(message)s)ÚlevelÚformatu&   ðŸ”„ Test 1: Synchronisation complÃ¨teu,   ðŸ”� Test 2: VÃ©rification positions activesu   
âœ… u$    position(s) active(s) vÃ©rifiÃ©e(s)r>   r?   r@   r;   r<   r=   z @ $rD   rE   u   
âœ… Aucune position active)rg   r   r   r   Útypingr   r   ÚloggingÚposition_monitorr   Ú	getLoggerrd   r   rh   r   ÚbasicConfigÚINFOÚsyncÚprintr[   rc   Úactiver   rY   r   rZ   r
   r
   r
   r   Ú<module>   s>   
 R,þ
æ