live on GenLayer

Your AI agent is about to pay.
GenCheck makes sure it should not.

The cheapest offer an agent finds is often a lookalike storefront. Before it signs a payment, GenCheck sends the checkout URL to GenLayer validator consensus: independent validators fetch the page and the brand's real site, judge whether the domain actually belongs to that brand, and write the verdict on-chain — where anyone can check it. An agent pays only on a verified real.

Every check submits a real on-chain transaction — the hash appears in ~2 s, the verdict when validators finalize. Or run a verified example.
submitting…
The intercept

GenCheck stops your agent paying a scam site

Your agent is about to pay. GenCheck checks the shop first — if it isn't the real store, the money never leaves the wallet.

✕ STOPPED amazon-clone.github.io not the real store — nothing was sent, wallet still 2.40 GEN
✓ PAID amazon.com the real store — 1.30 GEN sent, wallet 2.40 → 1.10 GEN
Live consensus / no transaction yet
Run a check above — the on-chain verdict, the validator jury, and the transaction's real cost appear here.
Audited transactions

Decisions the validator network has reached

Each card runs a new transaction against the live contract — the hash is yours to verify on the explorer.

Architectural flow

What happens between a URL and a verdict

01

Transaction

The agent calls validate_checkout before signing the payment. The hash is public immediately, so the decision is auditable whether or not the agent proceeds.

gl.public.write
02

Investigation

Each validator independently fetches the checkout page and the brand's official site inside the GenVM sandbox, and compares what it finds.

gl.nondet.web.render
03

Judgment & vote

Every validator's LLM — different models from different operators — judges domain ownership and page content, then votes. Validators must agree on the verdict itself.

gl.eq_principle.prompt_comparative
04

On-chain verdict

The agreed verdict is written to contract storage and cached per domain. A fetch that fails fails closed — unverifiable is never treated as safe.

TreeMap cache · fail-closed
Benchmarks

Measured, not projected

Live URLs through real validator consensus on studio-dev. Methodology and the v1 → v5 prompt-fix arc are in the repo.

93.9%
50 labeled URLs

46 of 49 verdicts correct on the live contract — live OpenPhish phishing pages, wrong-seller sites, and legitimate checkouts.

0
false positives

Not one of 23 lookalikes was cleared for payment.

14/23
blocks by detection

The other 9 failed closed or came back unsure. This run separates the two, so a dead page is not counted as a catch.

3
false negatives

Real checkouts blocked: two bot-block the validators, one was a genuine misjudgement. Disclosed rather than hidden.

Developer integration

One rule: no consensus-backed real, no payment

The gate lives in the agent's own payment path and fails closed — anything other than a verified real blocks.

MCP serverzero integration code
# reads are free; writes need a funded key
claude mcp add gencheck \
  --env GENCHECK_PRIVATE_KEY=0x… \
  -- python -m gencheck.mcp_server
Python clientthe agent's payment gate
from gencheck import GenCheck, decide

gc = GenCheck(private_key=os.environ["GENCHECK_PRIVATE_KEY"])
verdict = gc.validate(checkout_url, brand)
action, why = decide(verdict)  # fail-closed
if action != "PAY": halt(why)

Point your agent at the skillfor your agent

One markdown file — what GenCheck is, when to call it, and the one rule it must obey.
curl -s /skill.md