
    ̛h0             	       t   d dl mZ d dlZd dlZd dlZd dlmZ d dlZd dlZd dlZej                  j                  ej                  j                  ej                  j                  ej                  j                  e      d                   d dl d dl d dlmZ d dlmZ ej                  j                  ej                  j                  ej                  j                  ej                  j                  e      dd                   	  G d	 d
      ZdZdZd Zedk(  r ej4                   e              yy)    )timezoneN)tqdmz..)*)JupAPI)CoingeckoAPIAPPSc                   n   e Zd ZdZed        Zed        Zed5d       Zd Zed        Z	ed        Z
ed        Zed	        Zed
        Zed        Zed        Zed        Zed        Zedefd       Zedefd       Zed6defd       Zed6dedefd       Zed6defd       Zedefd       Zed6defd       Zed        Zed        Zd Zd Zd Zd6dZed         Z ed!        Z!ed"        Z"ed#        Z#d$ Z$d% Z%d& Z&d' Z'd( Z(d) Z)d* Z*ed+        Z+d, Z,d- Z-d. Z.d6d/Z/d0 Z0d1 Z1d2 Z2d7d3Z3d8d4Z4y)9Analyzerr   c                  2   d} t         j                  j                  |       sg S g }	 g }t        j                  |       D ]l  }t         j                  j	                  | |      }t         j                  j                  |      sC|j                  d      sU|dd }|j                  ||f       n |D ]  \  }}g }	 t        j                  |      D ]j  }t         j                  j	                  ||      }	t         j                  j                  |	      sC|j                  d      sU|dd }
|j                  |
       l 	 |j                  ||d        t        dt        |       d	       |S # t        $ r
}Y d}~>d}~ww xY w# t        $ r}g cY d}~S d}~ww xY w)
uj  
        Собирает все токены из директории /src/data/wallets/, а затем для каждого токена
        находит все кошельки в папках wallet_{wallet}
        
        Возвращает список словарей: [{"token": token_hash, "wallets": [wallet1, wallet2, ...]}, ...]
        z-/home/ubuntu/SOL_API/sol_API/src/data/walletswallets_for_   Nwallet_   )tokenwalletsFound z tokens with total wallets)ospathexistslistdirjoinisdir
startswithappend	Exceptionprintlen)base_wallets_pathtoken_wallet_listtoken_foldersitem	item_path
token_hash
token_pathr   wallet_itemwallet_item_pathwalletes               0/home/ubuntu/SOL_API/sol_API/src/v3/utils/new.pyget_all_tokens_and_walletsz#Analyzer.get_all_tokens_and_wallets-   s    Lww~~/0I%	M

#45 BGGLL):DA	77==+0O!%bcJ!((*i)@AB +8 &
J')zz*'= 3+-77<<
K+P( 77==)9:{?U?UV_?`%0_F#NN623 "(('&* !* F30122LMN !  !   	I	s[   AF F $F 8AE+E+"E+:/F +	E>4F 9E>>F 	F
FFFc                     dddddt         d} 	 t        j                  di | }d}|5  |j                         5 }|j	                  |       |j                         }g }|D ]'  }t        |       |j                  |d   |d	   d
       ) t        dt        |       d       t        j                  j                  d      }t        j                  ||       |cd d d        cd d d        S # 1 sw Y   nxY w	 d d d        y # 1 sw Y   y xY w# t        j                  $ r}t        d|        g cY d }~S d }~wt        $ r}t        d|        g cY d }~S d }~ww xY w)N	localhostrootz&YiHV8]i9LL5r   utf8mb4)hostuserpassworddatabasecharsetcursorclassa&  
                SELECT
                    wp.token_extracted, wp.wallet_hash
                FROM wallets_processed wp
                JOIN wallet_filters wf ON wp.wallet_hash = wf.wallet_hash
                WHERE wf.type = 'GOLD'
                ORDER BY wp.date_processed DESC
            wallet_hashtoken_extracted)r   r   r   z  processed wallets in time rangeFhome/ubuntu/SOL_API/sol_API/src/v3/for_DB_migrate/token_list_file.jsonzDatabase error in kek: zError in kek:  )
DictCursorpymysqlconnectcursorexecutefetchallr   r   r   r   r   r   StaticMethodsave_to_file
MySQLErrorr   )	WALLETS_DB_CONFIGconnqueryr<   resultswallets_datarowsave_token_wallet_list_pathr(   s	            r)   get_all_gold_walletszAnalyzer.get_all_gold_walletsd   su     &! %
%	??7%67DE  ([[] (fNN5)$oo/G#%L& c
$++'*='9%():%;-  F3|#4"55UVW 4677<<  AI  4J/ --l<WX'!( (( (( ( (( ( (& !! 	+A3/0I 	N1#&'I	sj   D D BC*	D  	D *C3	/D 7D  D	D 	D ED4.E4E EEEc           
         	 t        j                  t        t        t        t
        t         j                  j                        }d}|5  |j                         5 }|j                  || |f       |j                         }g }|D ]  }|j                  |d   |d   d        t        dt        |       d|  d|        |d	u r5t        j                  j!                  d
      }	t"        j%                  ||	       |cddd       cddd       S # 1 sw Y   nxY w	 ddd       y# 1 sw Y   yxY w# t         j&                  $ r}
t        d|
        g cY d}
~
S d}
~
wt(        $ r}
t        d|
        g cY d}
~
S d}
~
ww xY w)uh  
        Извлекает кошельки из базы данных, которые были обработаны в заданном временном диапазоне.
        
        Args:
            start_timestamp (int): Начальная временная метка (Unix timestamp)
            end_timestamp (int): Конечная временная метка (Unix timestamp)
            
        Returns:
            list: Список словарей с информацией о кошельках
                  [{"wallet": "wallet_hash", "token_extracted": "token_hash"}, ...]
        r/   r0   r1   r2   r4   aU  
                SELECT 
                    wallet_hash,
                    token_extracted,
                    date_processed
                FROM wallets_processed 
                WHERE date_processed >= FROM_UNIXTIME(%s) 
                AND date_processed <= FROM_UNIXTIME(%s)
                ORDER BY date_processed ASC
            r5   r6   )r'   r6   r   z! processed wallets in time range z - Tr7   Nz/Database error in get_wallets_with_time_range: z&Error in get_wallets_with_time_range: )r:   r;   DB_HOSTDB_USERDB_PASSWORDDB_NAME_WALLET_FILTERScursorsr9   r<   r=   r>   r   r   r   r   r   r   r?   r@   rA   r   )start_timestampend_timestampsaverC   rD   r<   rE   rF   rG   rH   r(   s              r)   get_wallets_with_time_rangez$Analyzer.get_wallets_with_time_range   s   -	??$/#OO66D	E  ([[] (fNN5?M*JK$oo/G#%L& $++&)-&8/23D/E-  F3|#4"55VWfVggjkxjyz{t|79ww||  EM  8N3$11,@[\'!( (( (( ( (( ( (& !! 	CA3GHI 	:1#>?I	sm   AD- D!BD8	D!	D- D	D!D- !D*&D- *D- -E; EE;E;!E60E;6E;c                 d    | j                         }| j                          | j                          y N)rT   get_needed_walletsanalyze_wallet)selftoken_wallets_lists     r)    get_token_wallet_list_time_rangez)Analyzer.get_token_wallet_list_time_range   s,    !==?!    c                    t         j                  j                  d| d|  d|  d|  d	      }t        j	                  |      }|sOt         j                  j                  d| d|  d|  d|  d	      }t        j	                  |      }|s| di i dd	ig d
gS t        |t              r;g }|D ].  }t        |t              sd|v sd|v s|j                  |       0 |r|S |S |S )Nz:/home/ubuntu/SOL_API/sol_API/src/data/wallets/wallets_for_z/wallet_z/transactions_for_wallet_/.jsonz/signatures_for_wallet_ERRORtotal_tokensr   )r'   classificationfiltersfilters_paramstokens_infotokensr   transactions)	r   r   r   r?   load_from_file
isinstancelistdictr   )r'   r#   	load_pathwallet_datafiltered_datar!   s         r)   get_data_filezAnalyzer.get_data_file   sY   GGLLHT\]c\dd}  E  ~F  FG  HN  GO  OT  U
	 #11)< HT\]c\dd{  }C  |D  DE  FL  EM  MR  S
I '55i@K$&-!&($2A#6    k4(M# /dD)go.TXBX!((./ %2=B{Br\   c                     | j                  dd      }| j                  dd      }| j                  d      }t               j                  |      }t        ||z        |z  dz  }|S )u   
        Функция для расчёта Market Cap по формуле из delta_sol и delta_token
        Использует динамическую цену SOL на момент транзакции
        	delta_solr   delta_token   	blocktimei ʚ;)getr   get_sol_price_on_timestampabs)transactionrq   rr   	timestamp	sol_pricemcs         r)   get_market_capzAnalyzer.get_market_cap   sb      OOK3	!oomQ7 __[1	 N==iH	[()I5E	r\   c                     | D cg c]  }|j                  d      dk(  s| }}|syt        |d       }|j                  d      S c c}w )u   
        Возвращает значение MC (Market Cap) для первой покупки (type == 'buy').
        Если покупок нет — возвращает None.
        typebuyNc                 &    | j                  dd      S Nrt   r   ru   xs    r)   <lambda>z+Analyzer.get_first_buy_mc.<locals>.<lambda>  s    k18M r\   keyMC)ru   min)rg   txbuy_transactions	first_buys       r)   get_first_buy_mczAnalyzer.get_first_buy_mc	  sP     *6Q259PBQQ(.MN	}}T"" Rs
   AAc                 &    t        d | D              S )uo   
        Проверяет, были ли покупки токена в диапазоне MC_RANGE.
        c              3      K   | ]B  }|j                  d       dk(  xr( t        |j                  dd      cxk  xr	 t        k  nc  D yw)r~   r   r   r   N)ru   MIN_MARKET_CAPMAX_MARKET_CAP).0r   s     r)   	<genexpr>z6Analyzer.get_token_buys_in_valid_mc.<locals>.<genexpr>  sA      
 FF6Ne#["&&q/([^([[
s   AA
any)rg   s    r)   get_token_buys_in_valid_mcz#Analyzer.get_token_buys_in_valid_mc  s      
"
 
 	
r\   c                 r    d}| D ]/  }|j                  dg       }t        j                  |      s+|dz  }1 |S )u   
        Подсчитывает количество токенов кошелька, купленных в диапазоне MC_RANGE.
        r   rg   rs   )ru   r
   r   )analyzed_tokenscounttoken_entryrg   s       r)   'get_wallet_tokens_with_buys_in_valid_mcz0Analyzer.get_wallet_tokens_with_buys_in_valid_mc"  sF    
 * 	K&??>2>L22<@
	 r\   c                 n   d}| D ]  }|j                  d      s|j                  dg       }|D cg c]  }|j                  d      dk(  s| }}|sN|D ]V  }|j                  dd      }t        |j                  dd            }t        |cxk  r
t        k  sDn G|t        k\  sQ|dz  }   |S c c}w )	u[   Считает количество токенов, прошедших фильтр min_buyr   buy_in_valid_mcrg   r~   r   r   rq   rs   )ru   rw   r   r   MIN_BUY)r   r   r   rg   r   r   r{   rq   s           r)   get_count_min_buy_passed_tokensz(Analyzer.get_count_min_buy_passed_tokens.  s     * 	K??#45&??>2>L-9UrRVVF^u=TUU# ' VVD!_{A 67	!R9>9i7>RQJE	    Vs   B2
B2c                     t        | D cg c]  }|j                  d      s| c}      }|dk  ryd|z  dz  }|S c c}w )u  
        Рассчитывает динамический процент на основе количества токенов с buy_in_valid_mc
        1/2 для 2 токенов, 1/3 для 3 токенов, 1/4 для 4 токенов и т.д.
        
        r   rs   g      Y@g      ?d   )r   ru   )r   tvalid_tokens_countdynamic_percents       r)   get_dynamic_percent_for_tokensz'Analyzer.get_dynamic_percent_for_tokensD  sO     !_!YFW@X!!YZ" !33s: "Zs   <<c                 R   g }t        | d       D ]  }|j                  dd      }|j                  dd      }|j                  d      dk(  r6|dkD  r1|}|dk7  rt        |      |z  nd}|j                  ||d       d	|d
<   r|j                  d      dk(  s|dk  st        |      }d}|dkD  rT|rR|d   }	t	        ||	d         }
||
|	d   z  z  }|	dxx   |
z  cc<   ||
z  }|	d   dk(  r|j                  d       |dkD  r|rRt        |      }|dk7  r||z
  |z  dz  nd	|d
<    | S )up   
        Добавляет profit_percent к каждой транзакции по методу FIFO.
        c                 &    | j                  dd      S r   r   r   s    r)   r   z=Analyzer.get_profit_percent_to_transactions.<locals>.<lambda>Z  s    QUU;5J r\   r   rr   r   rq   r~   r   amountpriceNprofitsell        r   r   r   )sortedru   rw   r   r   pop)rg   
fifo_queuer   rr   rq   r   r   sold_amount
total_costlotused_amountrevenues               r)   "get_profit_percent_to_transactionsz+Analyzer.get_profit_percent_to_transactionsT  sY   
 
+JK 	fB&&2K{A.Ivvf~&;?$39Q;I/A!!Ve"DE#86)kAo!+. 
!Ao*$Q-C"%k3x="AK+G"<<JM[0M;.K8})"q) "Ao* i.LVZ[O* 4
BSHae8+	f, r\   c                    g }d}d}| D ]  }|j                  dd      }|j                  dd      }|j                  d      }|dk(  r/|dkD  r*|dk7  rt        |      |z  nd}|j                  ||d       l|dk(  sr|dk  sxt        |      }	t        |      }
||
z  }|	dkD  s|s|d   }t        |	|d	         }|||d
   z  z  }|d	xx   |z  cc<   |	|z  }	|d	   dk(  r|j	                  d       |	dkD  s|rS |dkD  r||z
  |z  dz  S y)u   
        Рассчитывает прибыльность по FIFO (первые купленные токены — первые продаются).
        r   rr   r   rq   r~   r   r   r   r   r   r   N)ru   rw   r   r   r   )rg   r   r   total_revenuer   rr   rq   tx_typer   r   r   r   r   s                r)   get_profit_percent_to_tokenz$Analyzer.get_profit_percent_to_tokenr  sC   
 

 	*B&&2K{A.IffVnG%K!O8Cq8HI4a!![5"IJF"{Q!+.i.(!Ao*$Q-C"%k3x="AK+G"<<JM[0M;.K8})"q) "Ao*	*. >"Z/:=DDr\   r'   c                    d}	 t        j                  t        t        t        t
        t         j                  j                        }|5  |j                         5 }|j                  || f       |j                         }|D ch c]  }|d   	 c}cddd       cddd       S c c}w # 1 sw Y   nxY w	 ddd       y# 1 sw Y   yxY w# t         j                  $ r t               cY S w xY w)ut   
        Получает токены, созданные указанным кошельком из БД.
        z?SELECT token_hash FROM token_migrations WHERE creator_hash = %srK   r#   N)r:   r;   rL   rM   rN   DB_NAME_TOKENSrP   r9   r<   r=   r>   rA   set)r'   rD   rC   r<   rE   rG   s         r)   get_created_tokens_from_dbz#Analyzer.get_created_tokens_from_db  s    
 R	??$'#OO66D  B[[] BfNN56)4$oo/G9@A#C-AB BB B BB B BB B B !! 	5L	s`   AC	 B=(B'B"B'	B=	C	 "B''B0	,B=4C	 =CC	 C	 	C)(C)r#   c                    d}	 t        j                  t        t        t        t
        t         j                  j                        }|5  |j                         5 }|j                  || f       |j                         }|r|d   nd}|cddd       cddd       S # 1 sw Y   nxY w	 ddd       y# 1 sw Y   yxY w# t         j                  $ r
}Y d}~yd}~ww xY w)uh   
        Получает создателя токена из БД по хэшу токена.
        ?SELECT creator_hash FROM token_migrations WHERE token_hash = %srK   creator_hashN)r:   r;   rL   rM   rN   r   rP   r9   r<   r=   fetchonerA   )r#   rD   rC   r<   resultcreatorr(   s          r)   get_token_creator_from_dbz"Analyzer.get_token_creator_from_db  s    
 R	??$'#OO66D  #[[] #fNN5:-8#__.F8>f^4DG"	# ## ## # ## # # !! 		sN   AB< B0.B	B0	B< B#	B0'B< 0B95B< 9B< <CCNc                   K   d}	 |r|j                         4 d{   }|j                  t        j                        4 d{   }|j	                  || f       d{    |j                          d{   }|r|d   ndcddd      d{    cddd      d{    S t        j                  t        t        t        t               d{   }|4 d{    |j                  t        j                        4 d{   }|j	                  || f       d{    |j                          d{   }|r|d   ndcddd      d{    cddd      d{    S 7 M7 (7 7 7 7 # 1 d{  7  sw Y   nxY wddd      d{  7   y# 1 d{  7  sw Y   yxY w7 7 7 7 7 7 k7 \# 1 d{  7  sw Y   nxY wddd      d{  7   y# 1 d{  7  sw Y   yxY w# t        $ r Y yw xY ww)u}   
        Асинхронно получает создателя токена из БД по хэшу токена.
        r   Nr   r/   r0   r1   db)acquirer<   aiomysqlr9   r=   r   r;   rL   rM   rN   r   r   )r#   poolrD   rC   r<   r   s         r)   get_token_creator_from_db_asyncz(Analyzer.get_token_creator_from_db_async  s    
 R	<<> J JT#{{8+>+>? J J6$nnUZMBBB'-'8!89?vn5TJ J JJ J J &--  (%	    J J#{{8+>+>? J J6$nnUZMBBB'-'8!89?vn5TJ J JJ J JJJB!8JJJ J JJ J J J JJJB!8JJJ J JJ J J J J
  		s  HG> E)G> $FE,FE8E/ E87E28E8FE4FG> !E6"G> &H',G> F4
G> F6G> "$G)F8G)
G!F:"G9F<:GG)F>G)G> #G $G> (H)G> ,F/E82E84F6G> 8F
	>F?F
	FG> FG> HF1%F(&F1-G> 0H1G> 6G> 8G):G<G>G) G> G	G	G	G)G> "G%#G> (H)G;/G20G;7G> :H;G> >	H
H	H

Hr   c                    d}d}	 t        j                  t        t        t        t
        t         j                  j                        }|5  |j                         5 }|j                  || f       |j                         }|r	 ddd       ddd       y|j                  || ||f       |j                          	 ddd       ddd       y# 1 sw Y   nxY w	 ddd       y# 1 sw Y   yxY w# t         j                  $ r
}Y d}~yd}~ww xY w)u  
        Добавляет создателя токена в БД, если записи не было.
        
        Args:
            token_hash: хэш токена
            creator_hash: хэш создателя токена
            migration_started: время начала миграции (опционально)
            
        Returns:
            bool: True если успешно добавлено, False если произошла ошибка
        z=SELECT token_hash FROM token_migrations WHERE token_hash = %s
            INSERT INTO token_migrations (token_hash, creator_hash, migration_started) 
            VALUES (%s, %s, %s)
        rK   NFT)r:   r;   rL   rM   rN   r   rP   r9   r<   r=   r   commitrA   )	r#   r   migration_startedcheck_queryinsert_queryrC   r<   existingr(   s	            r)   set_token_creator_to_dbz Analyzer.set_token_creator_to_db  s     V
	??$'#OO66D   [[]  fNN;>%0H$     NN<*lL]1^_KKM               !! 		s`   AC, 
C 'C
C 
C, &C
9C C, 
C	C C,  C)%C, )C, ,D	D	c                    K   d}	 |r |j                         4 d{   }|j                  t        j                        4 d{   }|j	                  || f       d{    |j                          d{   }|r|j                  d      rx|d   }t        |d      r,|j                   |j                  t        j                        }t        |j                               cddd      d{    cddd      d{    S ddd      d{    ddd      d{    yt        j                  t        t         t"        t$               d{   }|4 d{    |j                  t        j                        4 d{   }|j	                  || f       d{    |j                          d{   }|r|j                  d      rx|d   }t        |d      r,|j                   |j                  t        j                        }t        |j                               cddd      d{    cddd      d{    S ddd      d{    ddd      d{    y7 O7 *7 7 7 7 y7 k# 1 d{  7  sw Y   |xY w7 t# 1 d{  7  sw Y   yxY w7 Z7 R7 -7 7 7 7 y7 j# 1 d{  7  sw Y   zxY w7 q# 1 d{  7  sw Y   yxY w# t&        $ r Y yw xY ww)u   
        Асинхронно получает время начала миграции (migration_started) для токена из БД.
        DSELECT migration_started FROM token_migrations WHERE token_hash = %sNr   tzinfor   r   )r   r<   r   r9   r=   r   ru   hasattrr   replacer   utcintry   r;   rL   rM   rN   r   r   )r#   r   rD   rC   r<   r   migration_dts          r)    get_migration_time_from_db_asyncz)Analyzer.get_migration_time_from_db_async  s    
 W	<<> 	A 	AT#{{8+>+>? A A6$nnUZMBBB'-'8!8!fjj1D&E+12E+FL&|X><CVCVC^/;/C/C8<</C/X#&|'='='?#@A A A	A 	A 	AA A	A 	A< ' &--  (%	    	A 	A#{{8+>+>? A A6$nnUZMBBB'-'8!8!fjj1D&E+12E+FL&|X><CVCVC^/;/C/C8<</C/X#&|'='='?#@A A A	A 	A 	AA A	A 	A =	AAB!8A	AA A A A	A 	A 	A 	A< '	AAB!8A	AA A A A	A 	A 	A 	A   		s+  K>K/ I,K/ $JI/J	J I2!J8I59A,J%J1I82J6K/ I;K/ K>JI>JK/ #J$K/ (K>),K/ J/
K/  J2!K/ $$KJ5	KK#J8$K;J;<A,K(K4J=5K9K/ J?K/ 
K>KKKK/ &K'K/ +K>,K/ /J2J5J8J;K/ >JJ	J
J	JK/ J, J#!J,(K/ +K>,K/ 2K/ 5K8K;K=K?K/ KK		K
K	KK/ K, K#!K,(K/ +K>,K/ /	K;8K>:K;;K>c                 t   d}	 t        j                  t        t        t        t
        t         j                  j                        }|5  |j                         5 }|j                  || f       |j                         }|ry|j                  d      rh|d   }t        |d      r,|j                   |j                  t        j                         }t#        |j%                               cddd       cddd       S ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w# t         j&                  $ r Y yw xY w)u~   
        Получает время начала миграции (migration_started) для токена из БД.
        r   rK   r   r   Nr   )r:   r;   rL   rM   rN   r   rP   r9   r<   r=   r   ru   r   r   r   r   r   r   ry   rA   )r#   rD   rC   r<   r   r   s         r)   get_migration_time_from_dbz#Analyzer.get_migration_time_from_db?  s   
 W	??$'#OO66D  =[[] =fNN5:-8#__.F&**-@"A'-.A'B #<:|?R?R?Z+7+?+?x||+?+TL"<#9#9#;<= == === == == = !! 		sU   AD! DBD	%	D.	D! 8D D! 	D	DDD! D! !D76D7c                    d}d}d}	 t        j                  t        t        t        t
        t         j                  j                        }|5  |j                         5 }|j                  || f       |j                         }|rY|j                  d      r	 ddd       ddd       y|j                  ||| f       |j                          	 ddd       ddd       y|j                  || ||f       |j                          	 ddd       ddd       y# 1 sw Y   nxY w	 ddd       y# 1 sw Y   yxY w# t         j                  $ r
}	Y d}	~	yd}	~	ww xY w)	uk  
        Добавляет время миграции токена в БД, если записи не было.
        Может также добавить создателя, если передан.
        
        Args:
            token_hash: хэш токена
            migration_started: время начала миграции (timestamp)
            creator_hash: хэш создателя токена (опционально)
            
        Returns:
            bool: True если успешно добавлено/обновлено, False если произошла ошибка
        zPSELECT token_hash, migration_started FROM token_migrations WHERE token_hash = %sr   z
            UPDATE token_migrations 
            SET migration_started = %s 
            WHERE token_hash = %s AND migration_started IS NULL
        rK   r   NFT)r:   r;   rL   rM   rN   r   rP   r9   r<   r=   r   ru   r   rA   )
r#   r   r   r   r   update_queryrC   r<   r   r(   s
             r)   set_token_migration_to_dbz"Analyzer.set_token_migration_to_db_  s:     i	??$'#OO66D  $[[] $fNN;>%0H#<<(;<#($$ $ #NN<:KZ9XY KKM#'$$ $  |j,Pa5bc##$$ $$ $ $$ $ $( !! 		sr   AD5 D)8DD)D5 &%DD)D5 &DD)
D5 D	D) D5 )D2.D5 2D5 5EEc                    | d   d   }|d   }|rt        d       t        d       nt        d       |d   }|rt        d       t        d	       nt        d
       |d   }|rt        d       t        d       nt        d       |d   }|rt        d       t        d       nt        d       |d   }|rt        d       t        d       y t        d       y )Nr   rc   tokens_per_hourz,[DISABLED] Would set filter: tokens_per_houru   ✅ Unique tokens per houru   ❌ Unique tokens per hour	hold_timez&[DISABLED] Would set filter: hold_timeu   ✅ Passed total holdu   ❌ Not passed total holdmin_buyz$[DISABLED] Would set filter: min_buyu
   ✅ Minbuyu
   ❌ Minbuy	migrationz&[DISABLED] Would set filter: migrationu   ✅ Percent migrationsu   ❌ Percent migrationcreated_tokensz+[DISABLED] Would set filter: created_tokensu   ✅ Percent created tokensu   ❌ Percent created tokens)r   )wallet_resultrc   r   r   r   r   r   s          r)   set_filters_to_dbzAnalyzer.set_filters_to_db  s    "9- ""34@A.0.0K(	:;)+-/)$89J J K(	:;*,)+ !12?@.0.0r\   c                    	 t        j                  di t        }|j                         }d}|j	                  || f       |j                         }|r8d}|j	                  ||| f       |j                          t        d|  d| d       j                          j                          y# t        $ r}t        d|        Y d}~=d}~ww xY w# j                          j                          w xY w)	zSet wallet type in databasez<SELECT 1 FROM wallet_filters WHERE wallet_hash = %s LIMIT 1;z
                    UPDATE wallet_filters
                    SET type = %s
                    WHERE wallet_hash = %s;
                    zUpdated wallet type to [TYPE:,]z"Error updating wallet type in DB: Nr8   )
r:   r;   rB   r<   r=   r   r   r   r   close)r'   new_trC   r<   select_queryr   r   r(   s           r)   set_wallet_type_to_dbzAnalyzer.set_wallet_type_to_db  s    	??7%67D[[]FYLNN<&3__&F 
 |eV_=5fXQugQGH LLNJJL	  	<6qc:;;	< LLNJJLs*   BB+ +	C4CC CC "C1c                     |j                  d      }|sy	 | j                  |      }|r|S 	 	 t               j	                  |      }|j                  d      }|S # t        $ r Y 8w xY w# t        $ r Y yw xY w)u   
        Получает время начала миграции токена.
        Сначала пробует получить его из базы данных.
        Если не удалось — обращается к API Jup.ag.
        r   Nr   )ru   r   r   r   get_token_pool_info)rY   r   r   migration_time	pool_infos        r)   get_migration_timezAnalyzer.get_migration_time  s     (	!<<UCN%% 	44U;I&]]+>?N!!  		  		s"   A +A( 	A%$A%(	A43A4c                   K   |j                  d      }|sy	 | j                  |       d{   }||S 	 	 t	               }|j                  |      }|r!d|v r|d   }|r	 |j                  d      }|S |S y7 I# t        $ r}t        d| d|        Y d}~ad}~ww xY w# t        $ r}t        d| d|        Y d}~|S d}~ww xY w# t        $ r}t        d| d|        Y d}~yd}~ww xY ww)	u  
        Асинхронно получает время начала миграции токена.
        Сначала пробует получить его из базы данных.
        Если не удалось — обращается к API Jup.ag.
        r   Nz*DB error getting migration time for token : r   r   z(Failed to save migration time to DB for zJupAPI error for token )ru   r   r   r   r   r   )	rY   r   sessionr   r   r(   jup_apir   r   s	            r)   get_migration_time_asyncz!Analyzer.get_migration_time_async  s3     (	M#'#H#H#OON)%% *	hG33E:I0I=!*+>!? "W"+--"?
 &%~%
 9 P  	M>ugRsKLL	M" % W HrRSQTUVV%%W  	+E7"QC89	s   C.A8 A6A8 C.(C  B 1C 2C.3C 4C.6A8 8	BBC.BC.	C(B?9C >C.?CC 	C+C&!C.&C++C.c                     | j                  |      }|-	 t               j                  |      }|j                  d      }|S |S # t        $ r d }Y |S w xY w)Nr   )r   r   r   ru   r   )rY   r   r   r   s       r)   get_token_creatorzAnalyzer.get_token_creator#  sb    007?"H88?	#--7 w  s   *A AAc                   K   |sy	 | j                  ||       d{   }||S 	 	 t               }|j	                  |      }|r4d|v r0|d   }|r'	 |j                  d      }| j                  |||       |S |S y7 \# t        $ r}t        d| d|        Y d}~td}~ww xY w# t        $ r}t        d| d|        Y d}~|S d}~ww xY w# t        $ r}t        d| d|        Y d}~yd}~ww xY ww)uX   
        Асинхронно получает создателя токена.
        Nz#DB error getting creator for token r   r   r   z!Failed to save creator to DB for z'JupAPI error getting creator for token )r   r   r   r   r   ru   r   )	rY   r   r   r   r   r(   r   r   r   s	            r)   get_token_creator_asyncz Analyzer.get_token_creator_async-  s6     	F @@MMG" #	JhG33E:I^y8#N3P)27J)K44UG^T w 3 N  	F7wbDEE	F  % P A%1#NOOP  	J;E7"QCHII	Js   C1A; A9A; C1(C
 $B" 4C
 5C16C
 7C19A; ;	BBC1BC1"	C+C<C
 C1CC
 
	C.C)$C1)C..C1c                 N   |syd}t        | j                  dg       d       }d}d}|D ]m  }|j                  dd      }|j                  d	d      }||kD  r nB|j                  d
      dk(  rd}||z  }n|j                  d
      dk(  r||z  }|sf|dk  sld}o |sy|dkD  ry|ryy)u-  
        Проверяет, удерживался ли токен хотя бы частично с покупки до миграции.

        Возвращает:
        - True: если часть токенов, купленных до миграции, осталась на момент миграции
        - False: если всё продано до миграции или перезакуп до миграции
        - None: если миграции не было или все покупки были после
        
        Nr   rg   c                 &    | j                  dd      S r   r   )r   s    r)   r   z5Analyzer.check_hold_until_migration.<locals>.<lambda>_  s    RTRXRXYdfgRh r\   r   Frt   r   rr   r~   r   Tr   )r   ru   )	r   r   balancerg   had_buy_beforefully_exited_beforer   timedeltas	            r)   check_hold_until_migrationz#Analyzer.check_hold_until_migrationP  s     koonbAGhi# 	+B66+q)DFF=!,En$vvf~&!%5 6)5 'Q,&*#	+  q[ r\   c                 2    syt        fd| D              S )NFc              3   t   K   | ]/  }|j                  d       dk(  xr |j                  dd      k   1 yw)r~   r   rt   r   Nr   )r   r   r   s     r)   r   z5Analyzer.check_buy_until_migration.<locals>.<genexpr>  s>      
 FF6Ne#P{A(>.(PP
s   58r   )rg   r   s    `r)   check_buy_until_migrationz"Analyzer.check_buy_until_migration|  s'       
"
 
 	
r\   c                     t        | d       } d}d}| D ]#  }|d   dk(  r||d   }|d   dk(  s||d   } n |y|y||z
  S )	u  
        Рассчитывает время между первой покупкой и первой продажей токена.

        Возвращает:
            int: время (в секундах) между первой покупкой и первой продажей
            str: 'hold', если продаж не было
            None: если покупок не было
        c                     | d   S Nrt   r8   r   s    r)   r   z6Analyzer.get_first_buy_sell_duration.<locals>.<lambda>  
    !K. r\   r   Nr~   r   rt   r   hold)r   )rg   first_buy_timefirst_sell_timer   s       r)   get_first_buy_sell_durationz$Analyzer.get_first_buy_sell_duration  s     l0HI 	B&zU"~'=!#K&zV#(B"$[/	 !"//r\   c                     t        | d       } d}d}d}| D ]C  }|d   dk(  r||d   }||d   z  }|d   d	k(  s$|t        |d         z  }|dk  s;|>|d   } n |y|y
||z
  S )u=  
        Рассчитывает время удержания токена от первой покупки до первой полной распродажи (обнуления баланса).
        Игнорирует все транзакции после первой полной распродажи.

        Возвращает:
            int: время удержания в секундах
            'hold': если продаж не было и баланс не обнулился
            None: если покупок не было
        c                     | d   S r  r8   r   s    r)   r   z.Analyzer.get_first_hold_time.<locals>.<lambda>  r  r\   r   r   Nr~   r   rt   rr   r   r  )r   rw   )rg   r  r  first_full_sell_timer   s        r)   get_first_hold_timezAnalyzer.get_first_hold_time  s     l0HI# 		B&zU"!)%'_N2m,,Fv%3r-011a<N$>+-k?(		 !'#n44r\   c                   	
 |syg }|D ]]  }|j                  d      s|j                  dg       }|s*t        |d       }|j                  dd      }|sM|j                  |       _ |sy|j                          t	        t        |            D ],  }||   

dz   	t        	
fd	|D              }|t        kD  s, y
 y)u   
        Фильтр по количеству токенов, купленных в пределах 1 часа,
        начиная с времени каждой первой покупки токена.
        Для каждого токена считается, сколько других токенов куплено в следующие 3600 секунд.
        Если где-либо количество превышает MAX_TOKENS_PER_HOUR — фильтр не пройден.
        Tr   rg   c                 &    | j                  dd      S r   r   r   s    r)   r   z;Analyzer.filter_wallet_by_tokens_per_hour.<locals>.<lambda>  s    quu[!7L r\   r   rt   r   i  c              3   >   K   | ]  }|cxk  xr k  nc   y wrV   r8   )r   r   end_time
start_times     r)   r   z<Analyzer.filter_wallet_by_tokens_per_hour.<locals>.<genexpr>  s     !U*"<H"<"<!Us   F)ru   r   r   sortranger   sumMAX_TOKENS_PER_HOUR)rY   r   purchase_timesr   rg   first_tx
block_timeicount_in_windowr  r  s            @@r)    filter_wallet_by_tokens_per_hourz)Analyzer.filter_wallet_by_tokens_per_hour  s      * 		2K??#45&??>2>L<-LMH!k15J%%j1		2  	s>*+ 	A'*J!D(H!!Un!UUO!44	 r\   c                 J   d}d}|D ]_  }|j                  d      du r|j                  d      }|dz  }|dk(  s||dz  }:t        |t        t        f      sQ|t        k\  s[|dz  }a |dk(  ry||z  dz  }t
        }|dk(  r|}nd| j                  z
  }	|	|k  r|	}n|}||k\  |fS )	u   
        Фильтр кошелька по времени удержания токенов.
        Проходит только если достаточно высокий процент токенов удерживался
        Возвращает (passed, percentage)
        r   r   Ffirst_hold_timers   r  Fr   r   )ru   ri   r   floatMIN_HOLD_TIME_SECONDSMIN_HOLD_TIME_PERCENTdynamick_percent_for_wallet)
rY   r   valid_hold_tokensra   r   r(  
percentageconst_requiredpassed_percentdynamic_requireds
             r)   filter_wallet_by_hold_timez#Analyzer.filter_wallet_by_hold_time  s     * 
	+K01U:)oo.?@OAL&(O,C!Q&!Oc5\:"&;;%*%
	+ 1',6#=
 /1+N  #T%E%EE.0!1!/^+Z77r\   c                 0   d}d}d}d}|D ]  }|j                  d      s|j                  dg       }|D cg c]  }|j                  d      dk(  s| }	}|	sN|dz  }d}
|	D ]e  }|j                  dd      }t        |j                  d	d            }t        |cxk  r
t        k  sDn G|dz  }|t        k  r|dz  }|t        k\  sdd
}
g |
s|dz  } |dk(  ry||z  dz  }dt
        z
  }|dk(  r|}nd| j                  z
  }||k  r|}n|}||k\  |fS c c}w )u   
        Фильтр кошелька по минимальной покупке - процент токенов с допустимым количеством малых покупок
        Возвращает (passed, percentage)
        r   r   rg   r~   r   rs   Fr   rq   Tr)  r   )ru   rw   r   r   r   MAX_SMALL_BUYS_PERCENTr-  )rY   r   valid_tokensra   
total_buys
small_buysr   rg   r   r   has_big_buy_in_valid_mcr{   rq   r/  r0  required_percentr2  s                    r)   filter_wallet_by_min_buyz!Analyzer.filter_wallet_by_min_buy  sq   
 

* 	"K??#45&??>2>L-9UrRVVF^u=TUU#AL ',#& 7VVD!_{A 67	!R9>9!OJ 7*"a
 G+26/7 '!1	"4 1 #\1S8
 551-  #T%E%EE.0#3 #1 --z99U  Vs   DDc                    d}d}|D ]B  }|j                  d      s|dz  }|j                  d      ,|j                  d      s>|dz  }D |dk(  ryt        }|dk(  r|}nd| j                  z
  }||k  r|}n|}||z  dz  }||k\  |fS )un  
        Фильтр по покупкам до миграции - MIN_TOKENS_BEFORE_MIGRATION_PERCENT токенов должны быть куплены до миграции
        Токены без migration_time считаются как НЕ купленные до миграции (плохие)
        Возвращает (passed, percentage)
        r   r   rs   r   buy_until_migrationr)  r   )ru   #MIN_TOKENS_BEFORE_MIGRATION_PERCENTr-  )	rY   r   migration_tokensra   r   r0  r1  r2  migration_percents	            r)   filter_wallet_by_migrationz#Analyzer.filter_wallet_by_migrationR  s     * 	*K01!??#34@[__UjEk$)$	* 1 =1+N  #T%E%EE.0!1!/-<C N24EEEr\   c                     	 |syd}t        |      }|D ]  }|j                  d      }||k(  s|dz  }  ||z  dz  }t        }|dk(  r|}	n| j                  }
|
|k  r|
}	n|}	||	k  |fS # t        $ r Y yw xY w)u  
        Фильтр по проценту созданных токенов.
        Возвращает процент токенов в кошельке, которые были созданы этим же кошельком и true/fallse (passed, percentage)
        Использует уже полученную информацию о создателях из analyzed_tokens.
        r   r   r   rs   r   )Fr   )r   ru   MAX_CREATED_PERCENT_PERCENTr-  r   )rY   r'   r   created_countra   r   r   r/  r0  r1  r2  s              r)   filter_wallet_by_created_tokensz(Analyzer.filter_wallet_by_created_tokensy  s    	"M/L. '%//)4f$!Q&M'
 (,6#=J8Nq !/ $(#C#C #n4%5N%3N /;; 		s   A( (A( 9A( (	A43A4c           
          | j                  |      | _        t        t        g}| j                  t        t
        t        t        dt        z
  t        t        |d	S )u`   
        Возвращает словарь с параметрами фильтров
        r   )	dynamicCONST_MAX_TOKENS_PER_HOURCONST_MIN_HOLD_TIME_SECONDSCONST_MIN_HOLD_TIME_PERCENTCONST_MIN_BUYCONST_MIN_NORMAL_BUYS_PERCENT)CONST_MIN_TOKENS_BEFORE_MIGRATION_PERCENT!CONST_MAX_CREATED_PERCENT_PERCENTCONST_MC_RANGE)r   r-  r   r   r   r+  r,  r   r5  r>  rC  )rY   tokens_resultMC_RANGEs      r)   rd   zAnalyzer.filters_params  sR     ,0+N+N}+]("N377)<+@+@$-03I-I9\1L&
 	
r\   c                    |d   j                  dg       }|d   j                  d      }| j                  |      }| j                  |      }| j                  |      }| j	                  ||      }| j                  |      |d   |d   |d   |d   t        |d   d      t        |d   d      t        |d   d      t        |d   d      d	}|S )u<   Применяет все фильтры к кошелькуr   rf   r'   rs      )	r   r   r   r   r   hold_time_percentmin_buy_percentr@  created_tokens_percent)ru   r3  r;  rA  rE  r&  round)	rY   analyzed_walletrf   r'   hold_resultmin_buy_resultmigration_resultcreated_resultfilters_results	            r)   apply_wallet_filterszAnalyzer.apply_wallet_filters  s     #''"5 #''1 55f=66v>::6B==ffM  $DDVL$Q%a()!,,Q/!&{1~q!9$^A%6:!&'7':A!>&+N1,=q&A

 r\   c                    d}d}| j                  dg       D ]  }|j                  d      dur|j                  d      }|j                  dg       }|s=|D cg c]  }|j                  d      dk(  s|d	    }}|sgt        |      }|||kD  sz|j                  d
      }	|	|dz  }|	t        kD  s|dz  } |dk(  ry||z  t        k\  ryyc c}w )u$  
        Проверяет, имеют ли токены, купленные после миграции или без миграции, высокий профит.
        Возвращает True, если более 50% таких токенов имеют профит > 200%.
        r   rf   r   Tr   rg   r~   r   rt   profit_percentrs   F)ru   r   PROFIT_PERCENT_FOR_NORMALSADMISSION_PERCENT)
rm   profitable_tokenschecked_tokens
token_infor   rg   r   	buy_timesr  r`  s
             r)   !filter_wallet_by_migration_profitz*Analyzer.filter_wallet_by_migration_profit  s     &//(B7 	/J~~/0<'^^,<=N%>>."=L3?[R266&>UZCZK[I[ ^N%.)H!+0@!A!-"a'N%(BB)Q.)+	/. Q.3DD% \s   C2Cc                 v   	 |d   d   d   }|d   d   d   }|d   d   d   }|d   d   d   }|d   d   d   }|d   d   d	   }|d   d   d
   }|dk(  r|dk(  r|r	|r|r|r|ryy|r/|r-|r+|r|r|dk\  ry|dk(  ryyt         j                  |d         ryyy# t        $ r}	t        d|	        Y d}	~	yd}	~	ww xY w)u:  
        Классифицирует кошелек на основе фильтров и количества токенов с покупкой в валидном MC.

        Категории:
            - GOLD: 2+ токена с покупками в MC, прошедшие все фильтры
            - SILVER: только 1 токен с покупкой в MC, есть и другие токены
            - GOLD_FRESH: все фильтры пройдены, только одна покупка и она в MC
            - FRESH: один токен, и неважно пройдены ли фильтры
            - NORMALPLUS: не все фильтры пройдены, но выполнено условие
            - NORMAL: не пройден один из фильтров (creator или migration)
            - TRASH: не пройдены базовые фильтры (hold, minbuy и unique_tokens_hour), и больше одного токена
            - ERROR: при возникновении исключения
        r   re   ra   tokens_with_buys_in_valid_mcrc   r   r   r   r   r   rs   z
GOLD FRESHFRESHrS  GOLDSILVER
NORMALPLUSNORMALTRASHz/ERROR in get_classification_wallet_by_filters: Nr`   )r
   rg  r   r   )
rY   r   ra   count_valid_mc
total_holdunique_tokens_hourminbuypercent_migrationpercent_created_tokensr(   s
             r)   $get_classification_wallet_by_filtersz-Analyzer.get_classification_wallet_by_filters  s,   "	(+M:>JL*1-m<=[\N&q))4[AJ!.q!1)!<=N!O"1%i0;F -a 0 ;K H%21%5i%@AQ%R" q !Q&!&8VHY^t+ 0V$)?%*%'1,'   AA-PQBRS+' 	CA3GH	s*   A!B %B 5B <B 	B8 B33B8c           
         g }t        |j                  dg       d       }|D ]  }|j                  dd      }|j                  dd      }|j                  d      }| j                  |      }|j                  d      |d	|j                  d
      |||j                  d      |d}	|j                  |	        ||d<   | j	                  |      }||d<   |S )u   
        Обновляет список транзакций в token_entry.
        - Полностью пересобирает каждую транзакцию.
        - Расчёт profit_percent выполняется отдельно.
        rg   c                 &    | j                  dd      S r   r   r   s    r)   r   z/Analyzer.analyze_transactions.<locals>.<lambda>2  s    Z[Z_Z_`kmnZo r\   r   rr   r   rq   r~   	signatureNrt   fee)ry  r~   r   rt   rq   rr   rz  r   )r   ru   r|   r   r   )
rY   r   updated_transactionsoriginal_transactionsr   rr   rq   r   r{   
updated_txs
             r)   analyze_transactionszAnalyzer.analyze_transactions+  s      " &{~r'JPo p' 	4B&&2K{A.IffVnG$$R(B  VVK0VVK0&*vve}	J !''
3!	4& ';N#  $FFG[\&:N#r\   c                    |j                  d      }| j                  |      }| j                  |      }| j                  |      }|j                  dg       }| j	                  |      }| j                  ||      }| j                  ||      }	| j                  |      }
| j                  |      }| j                  |      }| j                  |      }|||||	||
||||dS )Nr   rg   r   r   r   r=  hold_until_migrationr   first_buy_mcr`  first_buy_sell_durationr(  rg   )ru   r   r~  r   r   r  r  r   r   r  r  )rY   r   r   r   	token_remr   rg   r   r=  r  r  r`  r  r(  s                 r)   analyze_tokenzAnalyzer.analyze_tokenO  s    (((/--k:	00; }}^R899,G"<<\>Z#>>y.Y,,\:99,G"&"B"B<"P22<@ ,#6$8.(,'>.(
 	
r\   c                 P  K   t        |t              st        dt        |              yd|vsd|vry|j	                  d      }|sKg d}|D ]  }|j	                  |      s||   } n |s&t        dt        |j                                       y	 d|vr||d<   | j                  |||       d{   }| j                  |      }| j                  ||       d{   }	|j	                  dg       }
| j                  |
      }| j                  |
|	      }| j                  ||	      }| j                  |
      }| j                  |
      }| j                  |
      }| j!                  |
      }|||	||||||||
dS 7 7 # t"        $ r}t        d| d	|        Y d}~yd}~ww xY ww)
u   
        Асинхронная версия analyze_token с использованием HTTP сессии и connection pool.
        zInvalid token_entry format: Nr   rg   )r#   addressmintz3Token entry missing token field. Available fields: r  zError analyzing token r   )ri   rk   r   r~   ru   rj   keysr   r~  r   r   r  r  r   r   r  r  r   )rY   r   r   r   r   possible_token_fieldsfieldr   r  r   rg   r   r=  r  r  r`  r  r(  r(   s                      r)   analyze_token_asynczAnalyzer.analyze_token_asyncn  s    
 +t,0k1B0CDE +%{)J($E!. ??5)'.E
 KDQ\QaQaQcLdKefg!	k)',G$ 88NNG11+>I#'#@#@G#TTN$==<L"==lKO"&"@"@~"^#'#B#B9n#] 00>L!==lKN&*&F&F|&T#"66|DO ""0':(<#2 ,"0+B#2 ,  OT0  	*5'A378	s[   AF&"0F&E? 2E;3*E? E=BE? :F&;E? =E? ?	F#FF&F##F&c           	         | j                  ||      }g }|D ]?  }t        |t              sd|v sd|v s| j                  |      }|j	                  |       A t        |      | j                  |      t        d |D              | j                  |      d}|d |g | j                  |      |||dg}| j                  |      }	|	|d   d<   | j                  |      }
|
|d   d<   |S )	Nr   rg   c              3      K   | ]<  }|j                  d       s|j                  d      '|j                  d      s9d > ywr   r   Nr=  rs   r   r   r   s     r)   r   z*Analyzer.analyze_wallet.<locals>.<genexpr>  f       2ARWR[R[\mRnsxs|s|  ~N  tO  t[  `e  `i  `i  j  `@!  2A   AAAAra   ri  tokens_passed_migration_filtertokens_passed_min_buy_filterr'   rb   	for_tokenrc   rd   r  re   rf   r   rc   rb   )ro   ri   rk   r  r   r   r   r  r   rd   r^  rv  )rY   r'   r#   rm   rP  r   analyzedre   r   r]  rb   s              r)   rX   zAnalyzer.analyze_wallet  s    ((<& 	/K+t,K1GN^iLi--k:$$X.		/  .,0,X,XYf,g.1  2A  2A  /A,0,P,PQ^,_	
 "#"11-@#&#	
 	 22=A&4a#BB=Q-;a)*r\   c           	        K   | j                  ||      }t        j                  |D cg c]  }| j                  ||       c}  d{   }|D cg c]  }||	 }}t	        |      | j                  |      t        d |D              | j                  |      d}	|d|g | j                  |      ||	|dg}
| j                  |
      }||
d   d<   | j                  |
      }||
d   d<   |
S c c}w 7 c c}w w)uw   
        Асинхронная версия analyze_wallet с использованием HTTP сессии.
        Nc              3      K   | ]<  }|j                  d       s|j                  d      '|j                  d      s9d > ywr  r   r  s     r)   r   z0Analyzer.analyze_wallet_async.<locals>.<genexpr>  r  r  r  r  r   rc   rb   )ro   asynciogatherr  r   r   r  r   rd   r^  rv  )rY   r'   r#   r   rm   r   tokens_result_rawr   rP  re   r   r]  rb   s                r)   analyze_wallet_asynczAnalyzer.analyze_wallet_async  s<    
 ((< #*..*3
 $$[':3
 #  ->S5ARSS  .,0,X,XYf,g.1  2A  2A  /A,0,P,PQ^,_	
 "#"11-@#&#	
 	 22=A&4a#BB=Q-;a)*G3
  Ts5   &C8C,C8C1	C8C3C3BC83C8c                    | j                         }g }d}d}t        d |D              }t        d|        t        d|        d}t        t	        ||      ddd	      }|D ]  }|d
   }	|d   }
|
D ]  }t
        j                  j                  d| d      }||k\  r|j                          |c c S |dz  }	 | j                  ||	      }t        j                  ||       |dz  }|j                  d| d|        |j                  d         |j                          t        d| d| d       |S # t        $ r
}Y d}~d}~ww xY w)u   
        Запускает analyze_wallet для каждого токена и всех его кошельков.
        Ограничивает общее количество обработанных кошельков до 100.
        r   @B c              3   8   K   | ]  }t        |d            ywr   Nr   r   
token_datas     r)   r   z5Analyzer.analyze_wallets_from_data.<locals>.<genexpr>       X:C
9 56X   9   Всего кошельков для обработки: 2   Будет обработано максимум: u%   Сохранено кошельковu   кошелекzE{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, {rate_fmt}])totaldescunit
bar_formatr   r   E/home/ubuntu/SOL_API/sol_API/src/v2/tests/tests_files/analizer_files/r_   rs   u'   Сохранено кошельков: r^   Nu.   Итого успешно сохранено: u    из u,    обработанных кошельков)rI   r  r   r   r   r   r   r   r   rX   r?   r@   set_descriptionupdater   )rY   tokens_walletsall_resultswallet_countermax_walletstotal_walletssaved_counterprogress_barr  r#   r   r'   r   r   r(   s                  r)   analyze_wallets_from_dataz"Analyzer.analyze_wallets_from_data  s   
 224 XXXI-YZB;-PQ #m["AHo  wG&mo ) 	J#G,J +G " ww||WX^W__de "[0 &&(&&!#!00DF --fd;!Q&M 003Z[hZiijkyjz1{| ''*	0 	>}oVTbSc  dP  Q  	R ! s   8AD55	EEc                   K   | j                         }d}d}t        d |D              }d}|sY|D ]T  }|d   D ]J  }	t        j                  j	                  d|	 d      }
t        j                  j                  |
      sF|dz  }L V |s||z
  n|}t        d|        t        d	|        t        d
|        t        d|        t        d|rdnd        d}d}d}t        j                         4 d{   }g }|D ]}  }|d   }|d   }|D ]e  }	||k\  r n^t        j                  j	                  d|	 d      }
|st        j                  j                  |
      s|j                  |	|f       |dz  }g ||k\  s} n t        |      }|dk(  rt        d       	 ddd      d{    yt        d| d       t        dt        |      |      D ]  }||||z    }t        |      D 	cg c]#  \  }\  }	}| j                  |	|||||z   dz         % }}	}}t        j                  |ddi d{   }t        d |D              }t        d |D              }||z  }||z  }|t        |      z  }||z  dz   dz  dk(  s||k\  s||z
  }t        d| d| d| d| d| 
        ddd      d{    t        d| d | d!| d"       y7 7 (c c}}	}w 7 7 )# 1 d{  7  sw Y   9xY ww)#u   
        Асинхронная версия analyze_wallets_from_data с параллельной обработкой.
        r   r  c              3   8   K   | ]  }t        |d            ywr  r  r  s     r)   r   z;Analyzer.analyze_wallets_from_data_async.<locals>.<genexpr>@  r  r  r   zK/home/ubuntu/SOL_API/sol_API/src/v2/tests/tests_files/migration_files_gold/r_   rs   r  u   Уже обработано: u'   Осталось обработать: r  u3   Принудительная перезапись: u   Даu   НетNr   r  uO   Все кошельки уже обработаны! Нечего делать.u$   Начинаем обработку u    кошельков...return_exceptionsTc              3   ,   K   | ]  }|d k(  s	d  yw)skippedrs   Nr8   r   r   s     r)   r   z;Analyzer.analyze_wallets_from_data_async.<locals>.<genexpr>  s     #S&v?RA#Ss   
c              3   T   K   | ]   }|t        |t              r|dk7  sd " y w)Nr  rs   )ri   r   r  s     r)   r   z;Analyzer.analyze_wallets_from_data_async.<locals>.<genexpr>  s<       "OV=OXbciktXu  {A  EN  {N!  "Os   ((((
   u   Обработано: r^   u    | Сохранено: u    | Пропущено: u    | Осталось: u7   ✅ Завершено! Итого: сохранено u   , пропущено u"   , всего обработано u    кошельков)rI   r  r   r   r   r   r   aiohttpClientSessionr   r   r  	enumerate_process_wallet_asyncr  r  )rY   
batch_sizeforce_reprocessr  r  r  r  existing_filesr  r'   r   remaining_walletsr  skipped_counterprocessed_counterr   tasksr#   r   total_tasksr$  batchj
coroutinesrE   batch_skippedbatch_saved	remainings                               r)   analyze_wallets_from_data_asyncz(Analyzer.analyze_wallets_from_data_async6  s     224 XXX , ,
(3 ,F77<<eflemmrsD ww~~d+&!+,, CRMN:WdI-YZ-n-=>?78I7JKLB;-PQCoFckClmn  ((* 6	D 6	Dg E, 
'0
$Y/% (F%477<<_`f_gglmD
 'bggnnT.Bfj%9:"a'N( "[0'* e*Kagh96	D 6	D 6	D: 8E[\] 1c%j*5 DaJ/
 4=U3C //FJ ..vz7O]^ab]bef]fg
  !(
 Sd SS !$#SG#S S!  "O'  "O  O,=0!S\1! Oa'2-26G;6V +.? ?I23D2EQ{mSjkxjy  zQ  Ra  Qb  bw  xA  wB  C  D-DA6	D 6	Dp 	GVkl{k|  }_  `q  _r  rE  F  	Gq6	D 6	DH TU6	D 6	D 6	D 6	Ds   A:K2=A:K27K8K2;BK=KK2'K(K2-?K,(KK0K1AK!K&K21K2K2K2KK2K/#K&$K/+K2c                 D  K   	 t         j                  j                  d| d      }|s t         j                  j                  |      ry| j	                  |||       d{   }t
        j                  ||       |t        d| d|        |S 7 /# t        $ r Y yw xY ww)u   
        Обрабатывает один кошелек асинхронно.
        Пропускает кошельки, которые уже обработаны (если force_reprocess=False).
        r  r_   r  Nu%   ✅ Сохранен кошелек #r   )	r   r   r   r   r  r?   r@   r   r   )rY   r'   r#   r   r  wallet_numberr   r   s           r)   r  zAnalyzer._process_wallet_async  s     
	77<<WX^W__deD
 #rww~~d'; 44VZQQF%%fd3 (=m_BvhWXM R  		sG   B AB B 	B B .B B B 	BB BB )TrV   )2   F)FN)5__name__
__module____qualname__r-  staticmethodr*   rI   rT   r[   ro   r|   r   r   r   r   r   r   r   strr   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r&  r3  r;  rA  rE  rd   r^  rg  rv  r~  r  r  rX   r  r  r  r  r8   r\   r)   r
   r
   '   s   "# 5! 5!l . .` 9 9v  D   # # 
 
 	 	  *    : " "L 3  . c  0 #  8 ,C ,s , ,\ &3 & &P s  > 7c 7 7r &1 &1P  84(T!F ) )V 	
 	
 0 04 5 5D%N)8V8:t%FN#L
&6 % %P0j"H
><|'R+^0d]G~r\   r
   ,ByecHYVebjBDKNMz6GzcqjN1W7Y7pq85JkCq9vsgbonk,FuPzg51kJhYDLzBqzigmDgpXHGZ7xuaLren8d2btpmjDc                  p   K   t               } | j                  dd       d{    t        d       y7 w)ud   
    Главная асинхронная функция для запуска анализа.
    r  F)r  r  Nu5   Асинхронный анализ завершен!)r
   r  r   )analyzers    r)   mainr    s:      zH 
2
2bRW
2
XXX	
AB Ys   !646__main__)datetimer   r:   sysr   r   r  r  r   r   r   abspathr   dirname__file__utils.config	utils.StM
API.jupAPIr   API.coingeckoAPIr   r
   r   r'   r  r  runr8   r\   r)   <module>r     s      
 	     RWW__X-F MN O    ) RWW__X-Ff UV W$E EN4 	7	7
C zGKK r\   