# independent rebuild of h100 arm A trades from raw v4tape swaps (not importing h100.py)
import csv,json,collections,sys
D="/opt/sw/v4tape/";W="0x0bd7d308f8e1639fab988df18a8011f41eacad73"
rows=[r for r in csv.DictReader(open("/root/tm/h100/trades.csv")) if r["arm"]=="A"]
pick={}
for r in rows: pick.setdefault(r["exit"],r)
tps=[r for r in rows if r["exit"]=="tp"]; sel=[pick["quiet"]]+tps[:1]+tps[5:6]+tps[9:10]
print(collections.Counter(r["exit"] for r in rows))
ids={r["pool"] for r in sel}
P={}
for l in open(D+"pools.jsonl"):
    p=json.loads(l)
    if p["pool_id"] in ids:P[p["pool_id"]]=p
S=collections.defaultdict(list)
for l in open(D+"swaps.jsonl"):
    s=json.loads(l)
    if s["pool_id"] in ids:S[s["pool_id"]].append(s)
C=0.9999*0.97
for r in sel:
    pid=r["pool"];p=P[pid];ss=sorted(S[pid],key=lambda s:(s["block"],s["log_index"]))
    q0=p["quote"]=="native" or W<p["token"]
    def px(s):
        x=(int(s["sqrtP"])/2**96)**2
        return 0 if x<=0 else (1/x if q0 else x)
    f=ss[0]["t"];ent=next(s for s in ss if s["t"]>=f+63);e=px(ent)
    peak=max(int(s["liq"]) for s in ss if s["t"]<=ent["t"])
    out=None
    for s in ss:
        if s["t"]<=ent["t"]:continue
        peak=max(peak,int(s["liq"]));v=px(s)/e
        if int(s["liq"])<=.5*peak:out=("pull",0);break
        if v>=3:out=("tp",3*C);break
        if v<=.5:out=("stop",v*C);break
        if s["t"]>ent["t"]+3600:out=("time",v*C);break
    if not out:out=("quiet/open",0)
    print(pid[:12],"first",f,"entry_t",ent["t"],"csv_entry",r["entry_t"],"e_px",e,"hand",out,"csv",r["exit"],r["net_x"],"nswaps",len(ss))
