import sys,json,csv,random,collections
sys.path.insert(0,"/opt/sw"); sys.path.insert(0,"/opt/sw/sellsim")
from sellprobe import *
PM="0x8366a39cc670b4001a1121b8f6a443a643e40951"
TS="0x40e9cecb9f5f1f1c5b9c97dec2917b7ee92e57ba5563708daca94dd84ad7112f"
UR8="0x8876789976decbfcbbbe364623c63652db8c0904"
pools={}
for l in open("/opt/sw/v4tape/pools.jsonl"):
    r=json.loads(l); pools[r["pool_id"]]=r
def sg(x):
    x=int(x,16); return x-(1<<256) if x>>255 else x
def ts(n): return int(rpc("eth_getBlockByNumber",[hex(n),False])["result"]["timestamp"],16)
bn=int(rpc("eth_blockNumber",[])["result"],16)
def blk_at(t):
    lo,hi=bn-3000000,bn
    while hi-lo>1:
        m=(lo+hi)//2
        if ts(m)<=t: lo=m
        else: hi=m
    return lo
out=[]
for t in sys.argv[1:]:
    rows=[r for r in csv.DictReader(open(f"/root/tm/{t}/trades.csv")) if r.get("arm")=="A" and float(r["net_x"])>0.5 and pools.get(r["pool"],{}).get("quote")=="weth"]
    random.seed(5); random.shuffle(rows)
    for r in rows[:4]:
        pid=r["pool"]; pl=pools[pid]; e=int(r["entry_t"]); x=int(r["exit_t"])
        b0=blk_at(e); b1=blk_at(x)
        b1=min(b1,b0+1500)
        c=collections.Counter(); sellsender=collections.Counter(); sellw=0
        for b in range(b0,b1+1,100):
            lg=rpc("eth_getLogs",[{"address":PM,"topics":[TS,pid],"fromBlock":hex(b),"toBlock":hex(min(b+99,b1))}]).get("result",[])
            for g in lg:
                d=g["data"][2:]; a0=sg(d[:64]); s="0x"+g["topics"][2][-40:]
                if a0>0: c["sell"]+=1; sellw+=a0/1e18; sellsender[s[:10]]+=1
                else: c["buy"]+=1
        o=dict(test=t,pool=pid[:10],hook=pl["hooks"][-6:],net_x=r["net_x"],window_s=x-e,buys=c["buy"],sells=c["sell"],sell_weth=round(sellw,3),sell_senders=dict(sellsender))
        print(json.dumps(o),flush=True); out.append(o)
json.dump(out,open("census.json","w"))
