"""v3lp.py (FW Analyst 1): Mint and Burn logs, first 2 h, for v3 WETH pools whose market cap at +5 min is $100k+ (the A1.13 rule candidates).
Paid dRPC key read in code only. Batches of 20 pools x 2 topics."""
import json, sqlite3, time, urllib.request, pickle
src = open("/root/fwa1/v3pull.py").read().split("\n")
K = json.load(open("/opt/common/drpc_paid.json"))["robinhood"]
exec(next(l for l in src if l.startswith("U =")))
T_MINT = "0x7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde"
T_BURN = "0x0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c"
WIN = int(2 * 3600 / 0.101283)
P, W = pickle.load(open("/root/fwa1/v3/an.pkl", "rb"))
cand = [p["pool"] for p in P if p["feats"][300]["mc"] and p["feats"][300]["mc"] >= 1e5]
D = sqlite3.connect("/root/fwa1/v3/v3a1.db", timeout=120)
D.execute("CREATE TABLE IF NOT EXISTS lp(pool TEXT, b INT, li INT, kind TEXT, data TEXT, PRIMARY KEY(pool, b, li))")
D.execute("CREATE TABLE IF NOT EXISTS lpdone(pool TEXT PRIMARY KEY)")
done = {r[0] for r in D.execute("SELECT pool FROM lpdone")}
cb = dict(D.execute("SELECT pool, cb FROM meta").fetchall())
todo = [p for p in cand if p not in done]
print("cand", len(cand), "todo", len(todo), flush=True)
def post(body):
    for i in range(6):
        try:
            rq = urllib.request.Request(U, json.dumps(body).encode(), {"Content-Type": "application/json", "User-Agent": "Mozilla/5.0"})
            return json.load(urllib.request.urlopen(rq, timeout=120))
        except Exception as e:
            err = e; time.sleep(2 * (i + 1))
    raise err
for i in range(0, len(todo), 20):
    ch = todo[i:i + 20]; body = []
    for k, p in enumerate(ch):
        body.append({"jsonrpc": "2.0", "id": k, "method": "eth_getLogs", "params": [{"address": p, "fromBlock": hex(cb[p]), "toBlock": hex(cb[p] + WIN), "topics": [[T_MINT, T_BURN]]}]})
    res = post(body)
    for r in res:
        p = ch[r["id"]]
        if "result" not in r: print("err", p, str(r.get("error"))[:80]); continue
        for L in r["result"]:
            D.execute("INSERT OR IGNORE INTO lp VALUES(?,?,?,?,?)", (p, int(L["blockNumber"], 16), int(L["logIndex"], 16), "m" if L["topics"][0] == T_MINT else "b", L["data"]))
        D.execute("INSERT OR IGNORE INTO lpdone VALUES(?)", (p,))
    D.commit(); time.sleep(0.3)
    print(i, flush=True)
print("done", D.execute("SELECT COUNT(*) FROM lpdone").fetchone(), D.execute("SELECT kind, COUNT(*) FROM lp GROUP BY kind").fetchall())
