import sys, json, pandas as pd, bisect, collections
sys.path.insert(0,'/tmp/rl/deliver'); import family_check as fc
A=json.load(open('/tmp/run/anchors.json')); AT=[a[1] for a in A]
def blk(t):
    i=max(1,min(bisect.bisect_right(AT,t),len(A)-1));(b0,t0),(b1,t1)=A[i-1],A[i];return int(b0+(t-t0)*(b1-b0)/(t1-t0))
V3SWAP='0xc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67'
G=json.load(open('gecko.json')); d=pd.read_pickle('paths.pkl'); c=d[(d.src!='ctl_1to5M')&(d.pk7>=2e7)]
out=[]
def s256(h):
    v=int(h,16); return v-(1<<256) if v>>255 else v
for _,r in c.iterrows():
    g=G[r.tok]; pools=sorted(g['pools'],key=lambda p:-p['reserve'])[:3]
    res=[]
    for p in pools:
        b=blk(r.ignition); rec=dict(pool=p['pool'],dex=p['dex'])
        try:
            if len(p['pool'])==66:
                pr=fc.sell_probe(p['pool'],None,b)   # token side unknown here: count both directions per router
            elif len(p['pool'])==42 and 'v3' in p['dex']:
                t0=fc.rpc('eth_call',[{'to':p['pool'],'data':'0x0dfe1681'},'latest']); tok_c0=('0x'+t0[-40:])==r.tok
                logs=[]; bb=b; step=8000
                while bb<b+72000 and len(logs)<3000:
                    try: logs+=fc.rpc('eth_getLogs',[{'address':p['pool'],'topics':[V3SWAP],'fromBlock':hex(bb),'toBlock':hex(bb+step-1)}]); bb+=step
                    except RuntimeError: step//=4
                snd=collections.Counter(); sells=0
                for l in logs:
                    dd=l['data'][2:]; a0,a1=s256(dd[:64]),s256(dd[64:128]); tokamt=a0 if tok_c0 else a1
                    if tokamt>0: sells+=1; snd['0x'+l['topics'][1][-40:]]+=1
                pr=dict(swaps=len(logs),sells=sells,sell_routers=len(snd))
            else: pr=dict(note='not checked (dex %s)'%p['dex'])
        except Exception as e: pr=dict(err=str(e)[:80])
        rec.update(pr); res.append(rec)
    out.append(dict(sym=r.sym,tok=r.tok,checks=res)); print(r.sym, [(x['dex'][:12],x.get('swaps'),x.get('public_sells',x.get('sells')),x.get('public_buys'),x.get('note','')) for x in res],flush=True)
json.dump(out,open('probe2.json','w'))
