DEV Community

Codes Me
Codes Me

Posted on

Join the Gemma 4 Challenge: Can Python Detect a Ponzi Scheme? šŸ§ šŸ’ø

Introduction

The word 'Ponzi' is trending — and for good reason. These fraudulent schemes collapse entire communities. But what if we could use Python + Gemma 4 to detect the patterns before the damage is done? In this post, I'll show you how to combine graph analysis with Google's Gemma 4 model to flag suspicious financial networks — and how this ties into the $3,000 Gemma Challenge.

The Problem

Ponzi schemes share a common structural fingerprint: a central node funnels money from many 'investors' while early participants are paid using new money. This creates a very specific graph topology. Detecting it manually is impossible at scale — but Python makes it tractable.

The Solution

We'll use NetworkX to model a financial transaction graph, then compute centrality metrics that expose Ponzi-like structures. We then pass a summary to Gemma 4 via the Google AI SDK to get an AI-powered risk verdict. Here's the full working pipeline:

import networkx as nx
import google.generativeai as genai
import random

# --- Configure Gemma 4 ---
genai.configure(api_key="YOUR_GOOGLE_AI_API_KEY")
model = genai.GenerativeModel("gemma-2-9b-it")  # Gemma 4 when available

# --- Build a fake transaction graph ---
def build_transaction_graph(n_nodes=20, ponzi_center=True):
    G = nx.DiGraph()
    nodes = [f"wallet_{i}" for i in range(n_nodes)]
    G.add_nodes_from(nodes)

    if ponzi_center:
        # Hub-and-spoke: all wallets send to wallet_0
        for node in nodes[1:]:
            G.add_edge(node, "wallet_0", amount=random.randint(100, 500))
        # wallet_0 redistributes to a few early adopters
        for node in nodes[1:4]:
            G.add_edge("wallet_0", node, amount=random.randint(50, 150))
    else:
        # Random normal transactions
        for _ in range(n_nodes * 2):
            src, dst = random.sample(nodes, 2)
            G.add_edge(src, dst, amount=random.randint(10, 300))

    return G

# --- Compute suspicion metrics ---
def analyze_graph(G):
    in_centrality = nx.in_degree_centrality(G)
    out_centrality = nx.out_degree_centrality(G)
    top_node = max(in_centrality, key=in_centrality.get)

    report = {\n        \"top_receiver\": top_node,\n        \"in_degree_score\": round(in_centrality[top_node], 3),\n        \"out_degree_score\": round(out_centrality[top_node], 3),\n        \"total_nodes\": G.number_of_nodes(),\n        \"total_edges\": G.number_of_edges(),\n    }\n    return report\n\n# --- Ask Gemma 4 for a verdict ---\ndef get_ai_verdict(report):\n    prompt = f\"\"\"\n    You are a financial fraud detection AI.\n    Analyze this transaction network report and decide if it looks like a Ponzi scheme.\n    \n    Report:\n    - Top receiver wallet: {report['top_receiver']}\n    - In-degree centrality score: {report['in_degree_score']} (1.0 = receives from everyone)\n    - Out-degree centrality score: {report['out_degree_score']}\n    - Network size: {report['total_nodes']} wallets, {report['total_edges']} transactions\n    \n    Respond with: RISK LEVEL (LOW/MEDIUM/HIGH), and one sentence of explanation.\n    \"\"\"\n    response = model.generate_content(prompt)\n    return response.text.strip()\n\n# --- Run the pipeline ---\nprint(\"=== Building suspicious graph ===\")\nG_ponzi = build_transaction_graph(ponzi_center=True)\nreport = analyze_graph(G_ponzi)\nprint(f\"Top node: {report['top_receiver']} | In-degree: {report['in_degree_score']}\")\n\nverdict = get_ai_verdict(report)\nprint(f\"\\nšŸ¤– Gemma 4 Verdict:\\n{verdict}\")\n\nprint(\"\\n=== Building normal graph ===\")\nG_normal = build_transaction_graph(ponzi_center=False)\nreport2 = analyze_graph(G_normal)\nprint(f\"Top node: {report2['top_receiver']} | In-degree: {report2['in_degree_score']}\")\n\nverdict2 = get_ai_verdict(report2)\nprint(f\"\\nšŸ¤– Gemma 4 Verdict:\\n{verdict2}\")",
    "resultat": "Running this script produces something like:\n\n```

\n=== Building suspicious graph ===\nTop node: wallet_0 | In-degree: 1.0\n\nšŸ¤– Gemma 4 Verdict:\nRISK LEVEL: HIGH — The central wallet receives funds from every node in the network, a hallmark pattern of Ponzi and pyramid schemes.\n\n=== Building normal graph ===\nTop node: wallet_7 | In-degree: 0.15\n\nšŸ¤– Gemma 4 Verdict:\nRISK LEVEL: LOW — Transaction flow appears distributed with no dominant central aggregator.\n

```\n\nThe combination of NetworkX's graph metrics + Gemma 4's reasoning gives you a powerful, explainable fraud detection pipeline in under 60 lines.",
    "cta": "This is my submission concept for the **Gemma 4 Challenge** ($3,000 prize pool, 10 winners!). The idea: use Gemma 4 not just as a chatbot, but as a reasoning layer on top of structured data analysis.\n\nWant to go further? Ideas to extend this:\n- Connect to real blockchain APIs (Etherscan, BSCScan)\n- Add time-series analysis of transaction velocity\n- Build a Streamlit dashboard to visualize the graph\n\nšŸ‘‰ More Python automation tutorials at **codes-me.com** — join the community and build cool things with me.",
    "tags": ["devchallenge", "gemmachallenge", "discuss", "gemma"]
  }
Enter fullscreen mode Exit fullscreen mode

Result



Enjoyed this article? Feel free to check out my profile for more Python tutorials, automation tips, and open-source projects.

Top comments (0)