import requests,json,time,sys
UA={"User-Agent":"Mozilla/5.0 (Macintosh) Chrome/120"}
RPC="https://api.mainnet-beta.solana.com"
NOW_SLOT=requests.post(RPC,json={"jsonrpc":"2.0","id":1,"method":"getSlot"}).json()["result"];NOW=time.time()
def cursor(t):return "%012d0000000000-%d"%(int(NOW_SLOT-(NOW-t)/0.4),int(t*1000))
def ts_of(x):return int(time.mktime(time.strptime(x["timestamp"][:19],"%Y-%m-%dT%H:%M:%S")))-time.timezone
last=[0]
def get(u):
    for i in range(8):
        w=0.8-(time.time()-last[0])
        if w>0:time.sleep(w)
        last[0]=time.time()
        try:
            r=requests.get(u,headers=UA,timeout=30)
            if r.status_code==200:return r.json()
            time.sleep(5+5*i)
        except Exception:time.sleep(3)
    return None
L=json.load(open(sys.argv[1]));out={}
for n,(m,c) in enumerate(L):
    pts=[];seen=set()
    for k in range(25):
        anchor=c+(k+1)*3*3600;lo=anchor-3*3600;cur=cursor(anchor)
        for pg_ in range(3):
            r=get(f"https://swap-api.pump.fun/v2/coins/{m}/trades?limit=100&cursor={cur}&minSolAmount=0.5")
            if r is None:break
            t=r.get("trades",[])
            for x in t:
                if x["tx"] in seen:continue
                seen.add(x["tx"]);pts.append([ts_of(x),float(x["priceUsd"] or 0),x["type"],float(x["amountUsd"] or 0)])
            pg=r.get("pagination",{})
            if not pg.get("hasMore") or not t or ts_of(t[-1])<lo:break
            cur=pg["nextCursor"]
        if pts and min(p[0] for p in pts)<c and k==0:pass
    pages=len(seen)
    out[m]=sorted(pts)
    if n%10==0:json.dump(out,open(sys.argv[2],"w"));print(n,m,len(pts),pages,flush=True)
json.dump(out,open(sys.argv[2],"w"));print("done")
