import json,csv,sys,collections
t=sys.argv[1];TP=float(sys.argv[2]);D="/opt/sw/v4tape/";WETH="0x0bd7d308f8e1639fab988df18a8011f41eacad73"
T=[r for r in csv.DictReader(open(f'/root/tm/{t}/trades.csv')) if r['arm']=='A' and r['src']=='fwd']
want={r['pool'] for r 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)
def pxf(p):
    q0=(p["quote"]=="native") or WETH<p["token"]
    return lambda s:(lambda r:0 if r<=0 else (1/r if q0 else r))((int(s["sqrtP"])/2**96)**2 if s["sqrtP"] else 0)
out=[]
for r in T:
    p=r['pool'];S=sorted(sw[p],key=lambda s:(s["block"],s["log_index"]));px=pxf(pools[p]);en=int(float(r['entry_t']))
    ent=next((s for s in S if s["t"]>=en),None);e=px(ent)
    C=((1-pools[p]["fee"]/1e6)*0.97)**2
    if r['exit']=='tp':
        ex=next(s for s in S if s["t"]>ent["t"] and px(s)/e>=TP)
        gap=px(ex)/e
        # outside sellers near exit: price-down prints by other senders, price >=0.9*3x level
        prev=None;sellers=set();eth=0
        for i,s in enumerate(S):
            v=px(s)/e
            if prev is not None and v<prev and abs(s["t"]-ex["t"])<=60 and s["sender"]!=ent["sender"] and v>=0.9*TP:
                sellers.add(s["sender"])
            prev=v
        out.append((p[:10],'tp',float(r['net_x']),round(TP*C,3),round(gap,2),len(sellers)))
    else: out.append((p[:10],r['exit'],float(r['net_x'])))
tp=[o for o in out if o[1]=='tp']
print(t,'fwd A',len(out),'tp',len(tp),'exact rebuild',sum(abs(o[2]-o[3])<.01 for o in tp))
print('first print >=3x median',sorted(o[4] for o in tp)[len(tp)//2],'max',max(o[4] for o in tp))
print('tp with >=1 outside seller within 60s at >=2.7x',sum(o[5]>=1 for o in tp),'/',len(tp))
print(collections.Counter(o[1] for o in out))
