
    Ηi$                     L   d Z ddlZddlZddlmZ  ee          j        dz  Zd Zd Z		 	 	 d%de
d	e
d
ededede
de
dedede
de
fdZd&de
dedee         fdZdedefdZdefdZde
dededefdZde
d
e
d efd!Zde
dedz  fd"Zde
dee
         fd#Zde
dee         fd$ZdS )'z
Simple SQLite database for trade history.
The blockchain is the source of truth, but we cache trades locally
so the leaderboard and trade history load instantly.
    N)Pathzturbo.dbc                  t    t          j        t          t                              } t           j        | _        | S )N)sqlite3connectstrDB_PATHRowrow_factoryconns    !/var/www/html/turbo/backend/db.py_connr      s&    ?3w<<((D{DK    c                  n   t                      } |                     d           |                     d           |                     d           |                     d           |                     d           |                     d           |                                  |                                  dS )z"Create tables if they don't exist.a  
        CREATE TABLE IF NOT EXISTS trades (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            tx_hash TEXT,
            market_id TEXT,
            buyer TEXT,
            seller TEXT,
            outcome INTEGER,
            price INTEGER,
            size INTEGER,
            fee INTEGER DEFAULT 0,
            timestamp REAL,
            created_at REAL DEFAULT (strftime('%s','now'))
        )
    z<CREATE INDEX IF NOT EXISTS idx_trades_buyer ON trades(buyer)z>CREATE INDEX IF NOT EXISTS idx_trades_seller ON trades(seller)zDCREATE INDEX IF NOT EXISTS idx_trades_timestamp ON trades(timestamp)zACREATE INDEX IF NOT EXISTS idx_trades_market ON trades(market_id)aq  
        CREATE TABLE IF NOT EXISTS markets (
            market_id TEXT PRIMARY KEY,
            strike INTEGER,
            start_time INTEGER,
            end_time INTEGER,
            resolved INTEGER DEFAULT 0,
            outcome TEXT DEFAULT '',
            final_price INTEGER DEFAULT 0,
            created_at REAL DEFAULT (strftime('%s','now'))
        )
    Nr   executecommitcloser   s    r   init_dbr      s    77DLL  	 	 	 	LLOPPPLLQRRRLLWXXXLLTUUULL  	 	 	 	KKMMMJJLLLLLr    buyerselleroutcomepricesize	market_idtx_hashfee	timestamptakermakerc                 *   |dk    rt          j                     }t                      }|                    d|||                                 |                                |||||f	           |                                 |                                 dS )z5Record a trade. One row per fill, showing both sides.r   zwINSERT INTO trades (tx_hash, market_id, buyer, seller, outcome, price, size, fee, timestamp) VALUES (?,?,?,?,?,?,?,?,?)N)timer   r   lowerr   r   )r   r   r   r   r   r   r   r   r   r    r!   r   s               r   record_trader%   <   s    
 A~~IKK	77DLL 	B	)U[[]]FLLNNGUDRUW`a   	KKMMMJJLLLLLr      addresslimitreturnc                    |                                  }t                      }|                    d|||f                                          }|                                 g }|D ]e}|d         |k    }|                    |d         |d         |d         |d         dk    rdnd|d         |d	         |d
         ||d         d	           f|S )z Get a user's most recent trades.zNSELECT * FROM trades WHERE buyer=? OR seller=? ORDER BY timestamp DESC LIMIT ?r   r   r   r   UPDOWNr   r   r   r   )	r   r   r   sider   r   r   isBuyertxHash)r$   r   r   fetchallr   append)r'   r(   addrr   rowstradesris_buyers           r   get_user_tradesr7   L   s    ==??D77D<<X	tU  hjj 	 	JJLLLF  W:%wZk|iLA--DD6wZfI;	l

 

 
	 
	 
	 
	 Mr   since_timestampc                    t                      }|                    d| f                                          }|                    d                                          }|                                 i }|D ]}|d         ||d         <   i }|D ]}|d         |d         z  dz  }|d         dz  }	|d         dz  }
|d	         }|d
         }|d         }|                    |          }||fD ]}||vr	|ddd||<   ||         dxx         |z  cc<   ||         dxx         |z  cc<   |rh|dk    r6||         dxx         |	|z
  z  cc<   ||         dxx         |	d|
z
  z  z  cc<   ||         dxx         |z  cc<   ||         dxx         |z  cc<   t          |                                d d          }t          d |D                       }t          |d          d |dd         D             dS )ur  Get weekly leaderboard — volume and PnL per wallet since timestamp.

    PnL calculation:
    - Buyer pays size*price USDC, gets YES tokens
    - Seller JIT-splits: pays size*(1-price), gets NO tokens + receives size*price
    - If YES wins: YES tokens worth $1 each, NO worthless
    - If NO wins: NO tokens worth $1 each, YES worthless
    - PnL = payout - cost
    zMSELECT buyer, seller, price, size, market_id FROM trades WHERE timestamp >= ?zASELECT market_id, outcome, resolved FROM markets WHERE resolved=1r   r   r   r       J)@B r   r   g        walletvolumepnlr>   YESr?      c                     | d         S )Nr>    )ws    r   <lambda>z!get_leaderboard.<locals>.<lambda>   s
    AhK r   T)keyreversec              3   &   K   | ]}|d          V  dS )r>   NrC   .0rD   s     r   	<genexpr>z"get_leaderboard.<locals>.<genexpr>   s&      ,,(,,,,,,r      c                 v    g | ]6}|d          t          |d         d          t          |d         d          d7S )r=   r>   rL   r?   r<   )roundrI   s     r   
<listcomp>z#get_leaderboard.<locals>.<listcomp>   sV     
 
 
 {eAhK.C.CERSTYRZ\]L^L^__
 
 
r   N   )totalVolumeleaderboard)	r   r   r0   r   getsortedvaluessumrN   )r8   r   r4   marketsresolutionsmwalletsr5   	cost_usdcsize_shares
price_fracr   r   midr   r2   rankedtotals                     r   get_leaderboardra   g   s    77D\\W	  hjj  llK hjj  	JJLLL K 3 3&'	lAkN##!G 4 4vY7+0EF	i)+wZ)+
'
8n//#&&FO 	L 	LD7""+/3s K K 	x   I-   !!!Y.!!!  
	4%u%%%y)@@%%%&&&+Z*HH&&&& u%%%2%%%&&&)3&&&GNN$$*?*?NNNF,,V,,,,,E UA
 
CRC[
 
 
  r   c                      t                      } |                     d                                          d         }|                                  |S )NzSELECT COUNT(*) FROM tradesr   )r   r   fetchoner   )r   counts     r   get_trade_countre      s@    77DLL677@@BB1EEJJLLLLr   strike
start_timeend_timec                     t                      }|                    d| |||f           |                                 |                                 dS )z&Record a new market when it's created.zXINSERT OR IGNORE INTO markets (market_id, strike, start_time, end_time) VALUES (?,?,?,?)Nr   )r   rf   rg   rh   r   s        r   save_marketrj      sP    77DLLb	FJ1   	KKMMMJJLLLLLr   final_pricec                     t                      }|                    d||| f           |                                 |                                 dS )z+Mark a market as resolved with its outcome.zIUPDATE markets SET resolved=1, outcome=?, final_price=? WHERE market_id=?Nr   )r   r   rk   r   s       r   resolve_marketrm      sN    77DLLS	+y)   	KKMMMJJLLLLLr   c                     t                      }|                    d| f                                          }|                                 |dS t	          |          S )zGet a single market by ID.z'SELECT * FROM markets WHERE market_id=?N)r   r   rc   r   dict)r   r   rows      r   
get_marketrq      sP    77D
,,@9,
O
O
X
X
Z
ZCJJLLL
{t99r   c                     |                                  }t                      }|                    d||f                                          }|                                 d |D             S )z9Get all distinct market IDs where this wallet has traded.zSSELECT DISTINCT market_id FROM trades WHERE buyer=? OR seller=? ORDER BY rowid DESCc                     g | ]
}|d          S )r   rC   )rJ   r5   s     r   rO   z'get_user_market_ids.<locals>.<listcomp>   s    )))qAkN)))r   )r$   r   r   r0   r   )r'   r2   r   r3   s       r   get_user_market_idsrt      sf    ==??D77D<<]	t  hjj 	 	JJLLL))D))))r   c                 ~   |                                  }t                      }|                    d||f                                          }|                                 i }|D ]}|d         }||vr
|dddd||<   ||         }|d         |k    }|d         |d         z  dz  }	|r'|d	xx         |d         z  cc<   |d
xx         |	z  cc<   i|dxx         |d         z  cc<   |d
xx         |d         dz  |	z
  z  cc<   |                                D ]}|d	         }
|d         }|
dk    rp|dk    rj|
|z
  }|dk    r$||d	<   d|d<   |
dk    r|d
         ||
z  z  nd|d
<   M|dk     r&d|d	<   | |d<   |dk    r|d
         | |z  z  nd|d
<   yd|d	<   d|d<   d|d
<   t          |                                          S )z
    Aggregate trades per market to compute net position and cost basis.
    Returns list of {market_id, yes_shares, no_shares, total_cost}.
    zSELECT market_id, buyer, seller, outcome, price, size
           FROM trades WHERE buyer=? OR seller=?
           ORDER BY timestamp ASCr   r   )r   
yes_shares	no_shares
total_costr   r   r   r:   rv   rx   rw   r;   )r$   r   r   r0   r   rU   list)r'   r2   r   r3   	by_marketr5   r^   posr6   costyes_sno_snets                r   get_user_positions_by_marketr      st   
 ==??D77D<<	% 
t	 
 hjj 	 	JJLLL!#I @ @ni+.aa_`aaIcNnW:%&	AgJ&+@A 	@6*% &	)!F)i"74!?? !! & &L!;199$,CQww$'L!#$K INQRC$5u$E$EXYL!!q$%L!$'4K IMPQC$5#$E$EWXL!!$%L!#$K $%L!	  ""###r   )r   r   r   r   r   r   )r&   )__doc__r   r#   pathlibr   __file__parentr   r   r   r   intfloatr%   ry   ro   r7   ra   re   rj   rm   rq   rt   r   rC   r   r   <module>r      s2           
$x..
*
,  % % %R AC23/1  S 3 s '*:=*/  *-     S  T$Z    6AU At A A A AH    3       c C c    # $+    	* 	*c 	* 	* 	* 	*3$# 3$$t* 3$ 3$ 3$ 3$ 3$ 3$r   