About the project Inspiration People lose money on Solana by interacting first and checking later: a pasted address, a “support” wallet, a marketplace payout. Block explorers show transactions. They do not show a case file, a stored trail you can reopen, or a published statement that still admits what public chain data cannot prove.
I wanted a desk that answers one question: what should I verify before I send, connect, or trust this address? The name is FraudGraph. The product is evidence-aware investigation, not a blacklist and not a courtroom.
What it does FraudGraph turns a public Solana address into a named investigation:
Trace — crawl or reopen a stored trail of parsed SOL/SPL transfers. Amounts stay exact decimal strings. Signatures stay attributable. Evidence notes — public-page context, source-backed reports, and transfer marks. Sources stay sources. They are not identity proof. Assessment — transparent pattern rules, optional model suggestions, and an Isolation Forest comparison rank (unusualness vs a reference set, not a probability of crime). Decision — record a private review, accept / need more evidence / dismiss, then publish only an accepted lead. Safety directory — published records say verification advised. An unlisted address is not endorsed. Operator queue — admin checks of reports and reviews. A check does not relabel the graph. Custodial and privacy boundaries stop invented hops. The UI is forbidden from calling someone a scammer, criminal, or thief.
How I built it FastAPI investigation API on Neon Postgres (trails, cases, labels, reports, directory). Vanilla HTML/JS workbench: five-step case flow, dark transfer graph, operator inbox. Solana history via RPC / optional Helius; Bright Data for training-address discovery and public-page search. Behavior layer: heuristic multi-labels plus Isolation Forest rank on stored features. Labels are pattern language, not findings. Analyst auth on the desk; optional operator token for admin queues. Playwright tour that records a ~2 minute walkthrough of the real desk. What I learned Public chain data is rich and still incomplete. You can show who transferred to whom in this window. You cannot show the person, the intent, or a related off-chain withdrawal. The useful product is the limit made visible: stored evidence, a review lead, and a published caution—not a score that pretends to close the case.
I also learned that “fraud” in the product name fights the copy. Every saved statement, directory row, and model card had to stay pattern language, or the desk would overclaim.
Challenges Durable trails, not a one-shot graph. Reloading the API had to restore the same crawl membership, hops, and frontier. Exact amounts. Lamports and token units cannot go through JavaScript numbers. Assessment without guilt. Fan-out, aggregators, and bots look like payroll, airdrops, and market-making. Saving a case needed an explicit private-review path, not only a fired rule.