A market-surveillance agent that finds fake-volume trading rings on-chain —
and remembers every confirmed case so it catches the next one faster.
memory: – confirmed cases
– known false-positives
Public read-only demo. The detections, wallets and evidence below are queried live
from CockroachDB. Rulings and AI rationales are replayed from a recorded run — this
deployment carries no write access and no AWS keys, so it can't alter the evidence or spend.
The full live loop is in the repo and the demo video.
Trading never stops — so neither does the agent. A scheduled job (an AWS Lambda on a daily
timer) scans each day's new trades, detects fresh rings, and — the key part — ranks them by how
closely they match cases already confirmed in memory. The analyst opens a worklist that's already
triaged: "this new ring is 99% identical to confirmed case C020 — start here."
Step 1Daily blocksevery trade in the last 24h
Step 2Ring detectionclosed loops in the trade graph
Step 3AWS Bedrockembed each ring · 1024-dim
Step 4CockroachDB vector matchthe memoryagainst every confirmed case
Step 5Prioritized worklistranked before the analyst opens it
Detections by day
highelevatedlow
What this is. I pulled every LooksRare trade from 2022, built a graph of who-traded-with-whom,
and searched for closed loops — clusters of wallets that keep selling the same NFTs back to each
other. A genuine sale moves an NFT to a new owner; these loops never do. That's wash trading:
manufacturing fake volume to lure real buyers. Each case below is one ring I found — click one.
Step 2Ring detectiongraph cycles — who sold to whom
Step 3Same-NFT loopthe proofa token that came back to the group
Step 4CockroachDBcases + vector memory
Pick a case to see who did what
Why a memory? Every confirmed case leaves a case note — an analyst's write-up of what
happened, in plain language. The problem: two analysts describe the same scheme in completely different
words, so keyword search can't connect them. This agent embeds each case note and indexes it in CockroachDB,
so notes are matched by meaning, not wording (AWS Bedrock embeddings + vector search) — and the memory
gets sharper with every verdict. The story below shows it happening — just press Next and read.
Agent memory — durable rows in CockroachDB, shared by every instance
– confirmed · – known false-positives
Case note being checked
Plain-language rationale (AWS Bedrock)
embedding via Bedrock · vector search on CockroachDB…
Write your own case note
Describe some trading activity in your own words — plain English, no addresses,
no code. The agent embeds your note and searches memory for the closest case it has already seen,
exactly as it does above. Try wording a known scheme differently and watch it still match.
Click an example to load it, edit it, then press Check memory.
Ask the memory
The agent answers questions about its own case history by querying the
cluster through CockroachDB's Cloud Managed MCP Server — a separate surface from the
vector index above. It holds no write credentials: the client refuses any tool outside
a read-only allowlist. The SQL it generated is always shown, so nothing is taken on trust.