an on-chain AI reputation oracle on GenLayer Bradbury
Open the app . Contract . Deploy tx . Source
Most of what we call reputation is self-reported. Vouch replaces the claim-about-yourself with an attestation-from-a-peer that an AI assessor weighs and independent validators agree on, then writes to a public chain. What follows answers the questions a newcomer actually asks.
You open a profile, a handle and one claim of what you want to be known for. Then a peer (never you) files a vouch backed by written evidence. That vouch is the moment the assessor engages: it reads the claim and the evidence and returns a ruling with a credibility score, and the network settles it.
Three outcomes, each pinned to a score band so the word and the number always agree:
- TRUSTED , concrete, first-hand evidence supports the claim (credibility 67-100)
- MIXED , partial, generic, or loosely related evidence (credibility 34-66)
- UNVERIFIED , empty, off-topic, unsupported, or a manipulation attempt (credibility 0-33)
Because the contract refuses it. A vouch must come from an address other than the profile's subject, and that check runs before any model does. Reputation you mint alone is worth nothing, so the protocol makes it impossible.
You do not trust the answer; you trust that many machines reproduced it. The vouch runs through a custom validator on gl.vm.run_nondet_unsafe. The leader produces {ruling, credibility, note}, and every validator re-runs the same prompt and compares:
- the
rulingword must match exactly (it drives state), - the
credibilitymust agree within 20 points or 20 percent, whichever is larger (prose varies between runs, the number gets room), - error classes are compared so validators even agree on failures, and an
[LLM_ERROR]rotates the leader instead of locking in a bad result.
After consensus, deterministic backstops re-clamp the score into its ruling's band. The prompt deters manipulation; the code enforces coherence.
contracts/contract.py, class Vouch. Two writes, four reads.
| Call | Kind | Notes |
|---|---|---|
open_profile(handle, claim) -> id |
write, deterministic | validates lengths, assigns profile-N, no AI |
submit_vouch(profile_id, evidence) |
write, AI + consensus | guards (exists, evidence 1-600, voucher is not subject), rules, clamps, records |
get_profiles(start) |
view | page of profiles (20) |
get_profile(profile_id) |
view | one full record |
get_attestations(start) |
view | append-only event log (20) |
get_stats() |
view | O(1) counters: profiles, vouches, trusted, owner |
A profile record carries id, handle, claim, subject, status, ruling, credibility, vouch_count, last_note, last_voucher, index.
The verified write on Bradbury: the deployer opened profile-1 for ada.eth (a senior auditor who ships remediations before mainnet); a separate funded account filed an attestation describing a co-led audit that caught a reentrancy path two reviews had missed; the assessor ruled TRUSTED 85, validators agreed, and the profile settled with that ruling and a vouch count of one.
A static Next.js 14 export, no backend. Soft light-neumorphic design (pale surfaces, extruded shadows, a periwinkle-to-mint accent, Manrope and IBM Plex Mono), with the registry laid out as a clean structured grid and a live "trust lattice" that wires to the assessor core when your wallet connects. The contract owns every authoritative fact; the client only reads it and stages the deliberation. Chain plumbing sits in src/lib, stateful logic in src/hooks. Transaction status is polled with gen_getTransactionByHash so it escapes the view rate limit, and the leader's draft ruling is peeked from the receipt mid-consensus.
# contract
genvm-lint lint contracts/contract.py --json
gltest tests/integration/ -v -s --network studionet
# deploy + verify (GENLAYER_PRIVATE_KEY in .env, funded from the faucet)
python scripts/deploy.py
python scripts/verify_read.py
python scripts/verify_write.py # opens a profile, funds a peer, files the AI vouch
# frontend
cd frontend && npm install && npm run buildHosting is Cloudflare Pages, the build drops its basePath when CF_PAGES=1, so CF_PAGES=1 npm run build then wrangler pages deploy out --project-name vouch.
No deposit, stake, or custody, ever; you pay only network fees, mostly refunded after an AI write. Majority agreement settles a write, a single out-of-tolerance dissent is normal. A vouch is an AI ruling under validator consensus on a testnet, not a background check or financial advice. Test GEN: https://testnet-faucet.genlayer.foundation/