ERC-8004 on Celo Mainnet

We scored every agent.
Most failed.

Sentinel8004 scans all 2,902 agents on Celo's IdentityRegistry. Five independent scoring layers. Circuit breakers for spam. Every result written on-chain with IPFS proofs.

-- trusted (70+)
-- fair (30-69)
-- flagged (<30)
What we found in the registry.
Spam cluster
--
Agents from a single address. One owner mass-registered clones with identical metadata.
Dead endpoints
--
Feedback URIs that don't resolve. Registered but never deployed.
No metadata
--
Placeholder names, no description, no service endpoints declared.
Live finding
We found 1,797 sock puppet wallets gaming the ReputationRegistry.

Three agents inflated their trust scores by creating hundreds of wallets, each with exactly 2 transactions (fund + giveFeedback). The on-chain reputation layer was returning attacker-controlled data.

Toppa #1870 95 80
431 sock puppets filtered
Every puppet wallet: exactly 2 txs, funded from same source
Loopuman #17 936 puppets
getSummary returned 98. Actual score: 35.
On-chain reputation data is actively compromised
Agent #1865 437 puppets
Zero wallet overlap with other clusters
Separate funding sources, same attack pattern
Our fix
L5 now filters providers by on-chain tx history. Wallets with <5 total transactions are excluded as likely sock puppets. Verified against all 3 attack clusters and 2 clean agents on live chain.
Five layers, one score, written on-chain.
1
Read
Registry data
2
Probe
Endpoints
3
Score
5 layers
4
Breakers
Cap spam
5
Compose
0-100
Write
On-chain
On-chain proof
contract 0x8004...9dE9b63
registry 0x8004...9a432
written Loading...
writer 0xf994...4355
cost/tx ~0.009 CELO
// Read trust score for any agent
const feedback = await registry.getFeedback(agentId);
// => { value: 80n, tag1: "sentinel8004/trust-v2" }

if (feedback.value < 30n) {
  throw "Blocked by trust gate";
}
// AI agents query trust via MCP
{
  "tool": "check_agent_trust",
  "input": { "agentId": 1870 }
}
// => { score: 12, flags: ["MASS_REG"] }
// Static JSON for dashboards
const res = await fetch("data/scores.json");
const { reports } = await res.json();

const agent = reports.find(
  r => r.agentId === 132
);
// => { name: "Clenja", score: 57 }
Browse the full registry

Search, filter, and inspect all -- agents and their individual reports.

Open Registry