
    $hn/              	           d Z ddlmZ ddlmZmZmZmZ ddl ddl	 ddl
mZm
Z
 ddl ddlmZ  G d d      Z e       Zd	ed
eeef   fdZdd	edee   d
eeef   fdZy)z
Module for grouping and analyzing wallet transactions from ClickHouse
Provides functions to aggregate transaction data by token and calculate summary statistics
    )defaultdict)DictListAnyOptional)*)datedatetime)ClickHouseManagerc            	           e Zd ZdZd Zdedeeeef      fdZ	deeeef      deeeeef   f   fdZ
dedeeef   fdZdded
ee   deeef   fdZy	)TransactionGrouperz1Class to handle transaction grouping and analysisc                 "    t               | _        y N)r   clickhouse_manager)selfs    >/home/ubuntu/SOL_API/sol_API/src/v3/utils/groupTransactions.py__init__zTransactionGrouper.__init__   s    "3"5    wallet_addressreturnc                    	 d}d|i}| j                   j                  ||      }g d}g }|D ](  }t        t        ||            }|j	                  |       * |S # t
        $ r&}	t        j                  d|	 d       g cY d}	~	S d}	~	ww xY w)a  
        Query all transactions for a specific wallet from ClickHouse
        
        Args:
            wallet_address (str): The wallet address to query transactions for
            
        Returns:
            List[Dict]: List of transaction dictionaries
        a  
                SELECT 
                    wallet_address,
                    token_extracted,
                    signature,
                    type,
                    profit,
                    blocktime,
                    delta_sol,
                    delta_token,
                    fee,
                    MC
                FROM wallet_transactions 
                WHERE wallet_address = %(wallet_address)s
                ORDER BY blocktime ASC
            r   )
r   token_extracted	signaturetypeprofit	blocktime	delta_soldelta_tokenfeeMCz$Error querying wallet transactions: Texc_infoN)r   execute_querydictzipappend	Exception	db_loggererror)
r   r   queryparamsrowscolumnstransactionsrowtx_dictes
             r   get_wallet_transactionsz*TransactionGrouper.get_wallet_transactions   s    $	E" '7F**88GDG
 L -s7C01##G,-   	OOB1#FQUOVI	s   AA 	B"B=BBr.   c                    t        d       }|D ]  }|j                  dd      }|j                  dd      j                         }|j                  d      xs d}|j                  dd      }|j                  d	d      }|j                  d
d      }	|j                  d      }
|j                  dd      }||   d   j                  |       ||   d   j	                  |       |||   dxx   t        |      z  cc<   |dk(  r*||   dxx   dz  cc<   ||   dxx   t        |      z  cc<   n.|dk(  r)||   dxx   dz  cc<   ||   dxx   t        |      z  cc<   ||   dxx   |z  cc<   ||   dxx   |z  cc<   ||   dxx   |	z  cc<   |
s~||   d   	|
||   d<   nt        ||   d   |
      ||   d<   ||   d   
|
||   d<   t        ||   d   |
      ||   d<    i }|j                         D ][  \  }}t        |d         |d<   |d= t        |d         |d<   |d   |d<   |d   |d<   |d   d kD  r|d   |d   z  |d!<   nd|d!<   |||<   ] |S )"a  
        Group transactions by token and calculate summary statistics
        
        Args:
            transactions (List[Dict]): List of transaction dictionaries
            
        Returns:
            Dict: Grouped transactions with statistics per token
        c                  0    g ddddddddd d t               dS )N        r   )r.   total_profit
total_buystotal_sellstotal_buy_amounttotal_sell_amounttotal_delta_soltotal_delta_token
total_feesfirst_transaction_timelast_transaction_timeunique_signatures)set r   r   <lambda>z@TransactionGrouper.group_transactions_by_token.<locals>.<lambda>O   s/     #!$"!$&*%)!$'
 r   r   UNKNOWNr    r   r5   r   r   r   r   r   r.   r@   r6   buyr7      r9   sellr8   r:   r;   r<   r=   r>   r?   unique_transaction_counttotal_transactionsnet_token_changenet_sol_changer   avg_profit_per_transaction)r   getlowerr&   addfloatabsminmaxitemslen)r   r.   groupedtxtokentx_typer   r   r   r   r   r   resultdatas                 r   group_transactions_by_tokenz.TransactionGrouper.group_transactions_by_tokenE   s     
   /	BFF,i8EffVR(..0GVVH%,F{C0I&&4K&&$C{+I{B/I EN>*11"5 EN./33I> !~.%-?. %|,1,12c+6FF2F"}-2-23s;7GG3 EN,-:-EN./;>/EN<(C/( 5>":;C?HGEN#;<?B'?@)@GEN#;< 5>"9:B>GGEN#:;>A'>??GEN#:;[/	d "==? 	!KE4/248K3L/MD+,() *-T.-A)BD%&'+,?'@D#$%)*;%<D!" ()A-59.5IDQeLf5f125812 F5M!	!$ r   c           	      2   	 | j                  |      }|s|di dddddddS | j                  |      }t        d |j                         D              t        d |j                         D              t        d |j                         D              t        d |j                         D              t	        |      t	        |      d	}|t	        |      ||d}|S # t
        $ r5}t        j                  d
| d       |t        |      di i dcY d}~S d}~ww xY w)z
        Get complete transaction summary for a wallet
        
        Args:
            wallet_address (str): The wallet address to analyze
            
        Returns:
            Dict: Complete transaction summary grouped by token
        r   r5   )r6   r7   r8   r=   unique_tokens)r   rJ   tokensoverall_statsc              3   &   K   | ]	  }|d      yw)r6   NrB   .0
token_datas     r   	<genexpr>zDTransactionGrouper.get_wallet_transaction_summary.<locals>.<genexpr>   s     #o:J~$>#o   c              3   &   K   | ]	  }|d      yw)r7   NrB   rc   s     r   rf   zDTransactionGrouper.get_wallet_transaction_summary.<locals>.<genexpr>        !kz*\":!krg   c              3   &   K   | ]	  }|d      yw)r8   NrB   rc   s     r   rf   zDTransactionGrouper.get_wallet_transaction_summary.<locals>.<genexpr>   s     "m:m#<"mrg   c              3   &   K   | ]	  }|d      yw)r=   NrB   rc   s     r   rf   zDTransactionGrouper.get_wallet_transaction_summary.<locals>.<genexpr>   ri   rg   )r6   r7   r8   r=   r_   rJ   z-Error generating wallet transaction summary: Tr!   )r   r)   rJ   r`   ra   N)	r2   r]   sumvaluesrV   r'   r(   r)   str)r   r   r.   grouped_transactionsra   responser1   s          r   get_wallet_transaction_summaryz1TransactionGrouper.get_wallet_transaction_summary   s5   1	77GL&4*+ (+&''(&))*&	  $(#C#CL#Q  !$#oQeQlQlQn#o o!!kMaMhMhMj!kk""mOcOjOjOl"mm!!kMaMhMhMj!kk!$%9!:&),&7M #1&),&7.!.	H O 	OOKA3OZ^O_"0Q&'!# 	s#   C B5C 	D!*DDDNtoken_addressc           
         	 | j                  |      }|r$|D cg c]  }|j                  d      |k(  s| }}|sddiS | j                  |      }i }|j                         D ]U  \  }}|d   }	|d   }
|d   }d}|dkD  rt	        d	 |d
   D              }||z  dz  }|	|
|||d   |d   |	|d   z
  |d   d||<   W ||dS c c}w # t
        $ r1}t        j                  d| d       dt        |      icY d}~S d}~ww xY w)aq  
        Get detailed performance metrics for a wallet's token trades
        
        Args:
            wallet_address (str): The wallet address to analyze
            token_address (str, optional): Specific token to analyze, if None analyzes all tokens
            
        Returns:
            Dict: Performance metrics including profit/loss, win rate, etc.
        r   r)   zNo transactions foundr6   r7   r8   r5   r   c              3      K   | ]A  }|j                  d d      j                         dk(  r|j                  d      xs ddkD  rd C yw)r   rE   rH   r   r   rG   N)rN   rO   )rd   rX   s     r   rf   zBTransactionGrouper.get_wallet_token_performance.<locals>.<genexpr>  sK      )Gr*,&&*<*B*B*D*N+-66(+;+@qA*E *+ )Gs   AA	r.   d   rM   r=   rJ   )r6   r7   r8   win_rate_percentavg_profit_per_trader=   net_profit_after_feestransaction_count)r   token_performancez,Error calculating wallet token performance: Tr!   N)	r2   rN   r]   rU   rl   r'   r(   r)   rn   )r   r   rr   r.   rX   rW   performance_datarY   r\   r   buyssellswin_ratewinning_tradesr1   s                  r   get_wallet_token_performancez/TransactionGrouper.get_wallet_token_performance   sp   -	%77GL-9hrRVVDU=VZg=ghh!89966|DG  "&}} tn-L)]+ 19%( )GT.5I )G &GN !/ 6#=H %+"&#((0,01M,N"&|"4-3d<6H-H)-.B)C	+ '2 #1%5 C  iL  	%OOJ1#NY]O^SV$$	%s8   C B?B?C A?C ?C 	C>&C93C>9C>r   )__name__
__module____qualname____doc__r   rn   r   r   r   r2   r]   rq   r   r   rB   r   r   r   r      s    ;6.c .d4S>>R .`^T#s(^8L ^QUVY[_`ceh`h[iViQj ^@;S ;T#s(^ ;z8%3 8%xX[} 8%hlmprumuhv 8%r   r   r   r   c                 ,    t         j                  |       S )z
    Convenience function for web.py to get grouped wallet transactions
    
    Args:
        wallet_address (str): The wallet address to analyze
        
    Returns:
        Dict: Grouped transaction summary
    )transaction_grouperrq   )r   s    r   get_wallet_transactions_groupedr   !  s     ==nMMr   Nrr   c                 .    t         j                  | |      S )a  
    Convenience function for web.py to get wallet performance metrics
    
    Args:
        wallet_address (str): The wallet address to analyze
        token_address (str, optional): Specific token to analyze
        
    Returns:
        Dict: Performance metrics
    )r   r   )r   rr   s     r   get_wallet_performance_metricsr   .  s     ;;NMZZr   r   )r   collectionsr   typingr   r   r   r   utils.configutils.loggerr
   r	   	utils.StMutils.ClickHouseManagerr   r   r   rn   r   r   rB   r   r   <module>r      s   
 $ , ,   #  5K% K%^ )* 
NC 
NDcN 
N[3 [xPS} [`dehjmem`n [r   