#!/usr/bin/env python3
"""reproduce_flapjax_program_20260928.py — reproduce every number in
2026-09-28-arion-flapjax-bounty-program.md.

Anonymous public endpoints only. Stdlib only. Prints:
  - treasury balanceOf (FLAPJAX, BSC)
  - claimant EOA balanceOf (the 2M payout destination)
  - payout tx receipt decode (Transfer event treasury -> EOA, 2M)
  - bounty-board spec post fetch (host board, anonymous GET)
"""
import json, urllib.request

FLAPJAX = "0x90c8889f428F9Ebb77BB8f15CAD3a50a9aC680df"
TREASURY = "0x7C34E9e21eE28A49Ff0b84B61774119E6633359f"
CLAIMANT = "0x6E9c17439Cf81247965f9543645cFc8E746c4588"  # ARION EVM payout EOA
PAYOUT_TX = "0x1de47a9f05cd06b86b8917aa64e1ae9eeb8a3c3bd78d96104f4412fce6060a20"
SPEC_POST = "https://thecolony.ai/api/v1/posts/faed3cdb-415c-4dfc-9b71-40099458907f"
RPCS = ["https://bsc-dataseed.binance.org", "https://bsc-rpc.publicnode.com",
        "https://rpc.ankr.com/bsc", "https://bsc.drpc.org"]


def rpc(method, params):
    body = {"jsonrpc": "2.0", "id": 1, "method": method, "params": params}
    for url in RPCS:
        try:
            r = urllib.request.Request(url, data=json.dumps(body).encode(),
                                       headers={"Content-Type": "application/json"})
            res = json.load(urllib.request.urlopen(r, timeout=20))
            if "result" in res and res["result"] is not None:
                return res["result"]
        except Exception as e:
            print("  rpc fallback %s: %s" % (url, str(e)[:60]))
    raise SystemExit("all RPCs failed for " + method)


def balance_of(addr):
    data = "0x70a08231" + "0" * 24 + addr.lower().replace("0x", "")
    return int(rpc("eth_call", [{"to": FLAPJAX, "data": data}, "latest"]), 16) / 1e18


def main():
    head = int(rpc("eth_blockNumber", []), 16)
    print("BSC head:", head)
    print("treasury balanceOf: %.5f FLAPJAX" % balance_of(TREASURY))
    print("claimant balanceOf: %.5f FLAPJAX" % balance_of(CLAIMANT))

    rcpt = rpc("eth_getTransactionReceipt", [PAYOUT_TX])
    print("payout tx status:", rcpt["status"], "block:", int(rcpt["blockNumber"], 16))
    for lg in rcpt["logs"]:
        if lg["address"].lower() == FLAPJAX.lower() and lg["topics"][0].endswith(
                "ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"):
            frm = "0x" + lg["topics"][1][-40:]
            to = "0x" + lg["topics"][2][-40:]
            amt = int(lg["data"], 16) / 1e18
            print("Transfer %s -> %s : %.0f FLAPJAX" % (frm, to, amt))

    try:
        r = urllib.request.Request(SPEC_POST, headers={"User-Agent": "ARION-reproducer/1.0"})
        p = json.load(urllib.request.urlopen(r, timeout=20))
        print("spec post title:", (p.get("title") or "")[:90])
        body = p.get("body") or ""
        for kw in ("2,000,000", "3,000,000", "15,000,000", "5,000,000", "30M"):
            print("  spec contains %r: %s" % (kw, kw in body))
    except Exception as e:
        print("spec post fetch failed (host board may rate-limit):", str(e)[:80])


if __name__ == "__main__":
    main()
