import json,csv,collections
D="/opt/sw/v4tape/";WETH="0x0bd7d308f8e1639fab988df18a8011f41eacad73"
T=list(csv.DictReader(open("/root/tm/round60/trades.csv")))
want={x["pool"]:x for x in T}
pools={};
for l in open(D+"pools.jsonl"):
    p=json.loads(l)
    if p["pool_id"] in want: pools[p["pool_id"]]=p
sw=collections.defaultdict(list)
for l in open(D+"swaps.jsonl"):
    s=json.loads(l)
    if s["pool_id"] in want: sw[s["pool_id"]].append(s)
rem=collections.defaultdict(list)
for l in open(D+"liq.jsonl"):
    r=json.loads(l)
    if r["pool_id"] in want and int(r["liquidity_delta"])<0: rem[r["pool_id"]].append((r["t"],r["tx"],r["sender"]))
import sqlite3
db=sqlite3.connect("/opt/ppcopy/lp_remove.db")
for pid in want:
    for t,tx,s in db.execute("select t,tx,sender from lp_remove where pool=?",(pid,)): rem[pid].append((t,tx,s))
def price(p,s):
    q0=p["quote"]=="native" or WETH<p["token"]
    r=(int(s["sqrtP"])/2**96)**2
    return 0 if r<=0 else (1/r if q0 else r)
C=(1-0.0001)*(1-0.03)
out=["pool,exit,n_swaps,entry_t,exit_t,last_swap_t,lp_removals(t_after_entry),rebuilt_x,csv_x"]
for pid,x in want.items():
    S=sorted(sw[pid],key=lambda s:(s["block"],s["log_index"])); p=pools[pid]
    f=S[0]["t"]; ent=next(s for s in S if s["t"]>=f+63); e=price(p,ent)
    et=int(x["entry_t"]); xt=int(x["exit_t"])
    rm=[(int(t-et)) for t,_,_ in rem[pid] if t>=et-5]
    reb=""
    if x["exit"]=="tp":
        hit=next((s for s in S if s["t"]>ent["t"] and price(p,s)/e>=5),None)
        reb="%.3f@%s"%(5*C,hit["t"] if hit else "NOHIT")
    elif x["exit"]=="time":
        h=next((s for s in S if s["t"]>et+1200),None); reb="%.3f@%s"%(price(p,h)/e*C,h["t"]) if h else "NOSWAP"
    out.append(",".join(map(str,[pid[:14],x["exit"],len(S),et,xt,S[-1]["t"],"|".join(map(str,rm)),reb,x["net_x"]])))
open("r60_audit.csv","w").write("\n".join(out))
q=[o.split(",") for o in out[1:] if o.split(",")[1]=="quiet"]
print(len(q),"quiet; with removal after entry:",sum(1 for o in q if o[6]))
for o in out[1:]:
    if o.split(",")[1] in("tp",): print(o)
for o in q:
    if o[6]: print(o)
