import json,collections,math,sys
R={}
for l in open('/opt/sw/radar/radar.jsonl'):
    try:d=json.loads(l)
    except:continue
    if d.get('ev')=='cross' and d['th']==1000000 and not d.get('backfill') and (d.get('cap_first') or 1e9)<150000 and (d.get('depth_usd') or 0)>=20000 and d['pool'] not in R:
        R[d['pool']]=d
P=json.load(open('pools_cls.json')) if False else {}
cls={}
for l in open('/opt/sw/v4tape/pools.jsonl'):
    d=json.loads(l);cls[d['pool_id']]=(d['cls'],d['quote'],d['fee'],d['hooks'],d['init_time'])
S=collections.defaultdict(list)
for l in open('/opt/sw/v4tape/swaps.jsonl'):
    d=json.loads(l)
    if d['pool_id'] in R: S[d['pool_id']].append((d['t'],d['tick'],d['sender']))
rows=[]
for p,r in R.items():
    s=sorted(S.get(p,[]))
    if not s: rows.append((p,r['venue'],r.get('symbol'),'notape'));continue
    t0=r['t']
    pre=[x for x in s if x[0]<=t0]
    post=[x for x in s if x[0]>t0+7]
    if not pre or not post: rows.append((p,r['venue'],r.get('symbol'),'nopost'));continue
    # price direction: cap up => which tick direction? determine from ticks at first vs 1M
    tk0=s[0][1];tk1=pre[-1][1]
    sign=1 if tk1>=tk0 else -1
    e=post[0][1]
    def m(tk): return 1.0001**(sign*(tk-e))
    mx=1;res=None
    for t,tk,_ in post:
        x=m(tk)
        if res is None:
            if x>=3: res='tp3'
            elif x<=0.6: res='sl'
        mx=max(mx,x)
    last=m(post[-1][1])
    rows.append((p,r['venue'],r.get('symbol'),res or 'open',round(mx,2),round(last,2),cls[p][0],cls[p][2],len(post)))
for x in rows:print(x)
