<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Abhay Nayak</title>
    <description>The latest articles on DEV Community by Abhay Nayak (@quantbase).</description>
    <link>https://dev.to/quantbase</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4190383%2Fee4b613d-57bd-41b9-9942-f7b134749fe8.png</url>
      <title>DEV Community: Abhay Nayak</title>
      <link>https://dev.to/quantbase</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/quantbase"/>
    <language>en</language>
    <item>
      <title>Who is behind this meme coin? Building Sniff on a graph</title>
      <dc:creator>Abhay Nayak</dc:creator>
      <pubDate>Sat, 17 Oct 2026 11:28:24 +0000</pubDate>
      <link>https://dev.to/quantbase/who-is-behind-this-meme-coin-building-sniff-on-a-graph-4nnc</link>
      <guid>https://dev.to/quantbase/who-is-behind-this-meme-coin-building-sniff-on-a-graph-4nnc</guid>
      <description>&lt;p&gt;&lt;em&gt;By team Quant Agent, for WeMakeDevs × FalkorDB Graph Hacks, October 2026&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;More than ten thousand meme coins launch on pump.fun every day. Almost all of them die within hours. When a new one shows up on your screen, the question people actually ask isn't "will it go up?", because nobody can answer that honestly. It's simpler: &lt;strong&gt;who made this, and what happened to the last things they made?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That question is hard to answer by hand. The wallet that launched the coin is usually brand new. The real trail runs through whoever paid that wallet to launch it, and through whoever else that payer has paid. That takes two or three hops of "who sent money to whom", across hundreds of thousands of wallets.&lt;/p&gt;

&lt;p&gt;So we built &lt;strong&gt;Sniff&lt;/strong&gt;: paste a coin, and an AI agent walks a graph of on-chain history and answers in a few plain sentences. Every sentence links to the exact part of the graph that proves it.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://sniff.quantbase.live" rel="noopener noreferrer"&gt;https://sniff.quantbase.live&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/YMQKpynEsI0" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5uc7cgssqz19smqv6psd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5uc7cgssqz19smqv6psd.jpg" alt="Sniff's answer, with each claim's evidence highlighted on the map" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a graph
&lt;/h2&gt;

&lt;p&gt;We already had the raw material. Our QuantBase collector records public pump.fun data: launches, the wallet behind each one, who funded those wallets, the wallets that bought in the first seconds, and the social links each coin lists. Before the event it lived in Postgres tables, and every question we asked of it turned into a tower of self-joins.&lt;/p&gt;

&lt;p&gt;The questions are all shaped like paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who paid the creator? → Who else did that wallet pay? → What did &lt;em&gt;they&lt;/em&gt; launch? → Did any of it graduate?&lt;/li&gt;
&lt;li&gt;Do these two coins share a funder, an early buyer, or a Twitter account?&lt;/li&gt;
&lt;li&gt;Which wallets form one connected group of launchers?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In FalkorDB each of these is a single Cypher pattern. We loaded 632,339 pump.fun launches, 424,007 wallets and about 1.5 million relationships (CREATED, FUNDED, SNIPED, LINKS) with the bulk loader in &lt;strong&gt;30 seconds&lt;/strong&gt;. The questions that had been painful became one-liners. Rings of connected launchers come from &lt;code&gt;algo.WCC&lt;/code&gt;, and "how are these two connected?" comes from &lt;code&gt;algo.SPpaths&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Surprise 1: hubs make everything link to everything
&lt;/h2&gt;

&lt;p&gt;The first version of the graph said every coin was connected to every other coin within four hops, which is true and useless. The reason was exchanges. When a creator withdraws SOL from an exchange, the exchange's hot wallet shows up as their "funder", and that one wallet funds tens of thousands of creators.&lt;/p&gt;

&lt;p&gt;We call these wallets &lt;strong&gt;hubs&lt;/strong&gt;: any wallet that funded more than 200 others. There were 89 of them. They get their own label, keep a note of how many wallets they funded, and &lt;strong&gt;no query is allowed to walk through them&lt;/strong&gt;. A funding trail that reaches a hub stops there and says "this came from an exchange-like wallet, which tells us nothing about who is behind it."&lt;/p&gt;

&lt;p&gt;We tried to be cleverer and tell exchanges apart from big launch farms by what share of their wallets went on to create coins. It didn't work, because our funding data only covers wallets that created coins. The biggest hub funded 33,747 wallets and 80% of them were creators, simply because those were the only wallets we had looked up. So we kept the simple rule, wrote down why, and moved on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Surprise 2: the docs and the database disagreed
&lt;/h2&gt;

&lt;p&gt;FalkorDB 6.0.2 was a pleasure to work with, but a few things in the docs didn't match the running server. Here's what we hit, so you don't have to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Procedure names:&lt;/strong&gt; they differ between pages. On 6.0.2 they are &lt;code&gt;algo.WCC&lt;/code&gt;, &lt;code&gt;algo.BFS&lt;/code&gt;, &lt;code&gt;algo.pageRank&lt;/code&gt;,
&lt;code&gt;algo.labelPropagation&lt;/code&gt; and &lt;code&gt;algo.SPpaths&lt;/code&gt;. &lt;code&gt;CALL dbms.procedures()&lt;/code&gt; is the source of truth; check it first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full-text index:&lt;/strong&gt; the three-argument &lt;code&gt;db.idx.fulltext.createNodeIndex('Coin','name','symbol')&lt;/code&gt; from the
docs is refused. &lt;code&gt;CREATE FULLTEXT INDEX FOR (c:Coin) ON (c.name, c.symbol)&lt;/code&gt; works.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;WITH&lt;/code&gt;:&lt;/strong&gt; projections need an &lt;code&gt;AS&lt;/code&gt; alias.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timeouts:&lt;/strong&gt; a query timeout can't go above the server's &lt;code&gt;TIMEOUT_MAX&lt;/code&gt; (15 s by default).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bulk loader:&lt;/strong&gt; its default escape character is a backslash, and meme coins are sometimes literally named
&lt;code&gt;\&lt;/code&gt;. Pass &lt;code&gt;-x none&lt;/code&gt; and let your CSV writer double quotes instead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these took long once we knew, and they're all written down in the repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Surprise 3: one payer, 72 creators, zero graduations
&lt;/h2&gt;

&lt;p&gt;The first time the whole thing ran end to end, we asked about a coin called METHU. Its creator wallet had launched exactly one coin, which on its own looks like a first-time creator. One hop back told a different story.&lt;/p&gt;

&lt;p&gt;The wallet that paid METHU's creator, 0.009 SOL, had paid &lt;strong&gt;71 other brand-new wallets&lt;/strong&gt;. Each launched exactly one coin. &lt;strong&gt;None of the 72 coins graduated.&lt;/strong&gt; In the graph it's one funder with 72 spokes, each ending in a dead coin.&lt;/p&gt;

&lt;p&gt;That's the whole idea of Sniff in one picture. The creator alone looks clean; the payer is the story. And you can only see it if the data is shaped like the question.&lt;/p&gt;

&lt;h2&gt;
  
  
  An agent whose citations are checked
&lt;/h2&gt;

&lt;p&gt;The agent is Claude with nine tools, each a fixed, read-only Cypher query: coin lookup, funding trail, sibling creators, shared early buyers, shared socials, rings, shortest connection, top operators, and search. Claude decides which tools to call, up to eight, and writes the answer. It never writes Cypher itself.&lt;/p&gt;

&lt;p&gt;Every tool result carries &lt;strong&gt;evidence ids&lt;/strong&gt;: E1, E2 and so on. The answer has to end each sentence with the id that proves it. Then we check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A cited id has to be one a tool really returned.&lt;/li&gt;
&lt;li&gt;It has to come from a tool that can show that kind of claim. A sentence about reused socials can't cite
the funding tool.&lt;/li&gt;
&lt;li&gt;A sentence left with no valid citation is deleted. A shorter answer beats an unsupported one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the app, tapping a citation lights up exactly those wallets and coins on the map. If there's no AI key, or the AI call fails, the same tools produce a fixed summary instead, so the facts never depend on the model.&lt;/p&gt;

&lt;p&gt;We scored it on 30 questions, including six it should refuse ("will this pump?", "is it safe?", made-up addresses). On the live site all 10 questions we spent real calls on picked the right tools, cited valid evidence and stayed within the no-advice rule. What failed was length: half the answers ran past five sentences, so answers are now capped at five.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part: it explains, it doesn't predict
&lt;/h2&gt;

&lt;p&gt;We also run trading research on the same data, so we asked the uncomfortable question: do these graph signals help predict which coins do well after graduating?&lt;/p&gt;

&lt;p&gt;We built the features strictly as they would have been known at the moment each coin graduated: how many other creators the funder paid, two-hop funding, reused socials, shared early buyers. Then we tested them on 23,408 graduated coins, training on the older ones and testing on the newest third.&lt;/p&gt;

&lt;p&gt;On their own, the signals mean something. Coins whose social account had been used on another creator's coin were 18 points less likely to still be alive an hour later. But once you add what anyone can already see in a coin's first couple of minutes of trading, the graph adds &lt;strong&gt;nothing measurable&lt;/strong&gt;: the change in predictive accuracy was within ±0.01. Whatever the graph knows has already shown up in the price.&lt;/p&gt;

&lt;p&gt;So Sniff doesn't say "safe" or "scam", and it never says buy or sell. It tells you who is behind a coin and what their other coins did, with receipts, and ends every answer with the same line: &lt;em&gt;history, not a prediction.&lt;/em&gt; We think that's the honest version of this product, and the useful one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;App:&lt;/strong&gt; &lt;a href="https://sniff.quantbase.live" rel="noopener noreferrer"&gt;https://sniff.quantbase.live&lt;/a&gt; (try the METHU example).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your own agent:&lt;/strong&gt; &lt;code&gt;claude mcp add --transport http sniff https://sniff.quantbase.live/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/avasis-ai/quant-agent" rel="noopener noreferrer"&gt;https://github.com/avasis-ai/quant-agent&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built in four days on FalkorDB, Claude and a lot of pump.fun history.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>database</category>
      <category>solana</category>
      <category>hackathon</category>
    </item>
  </channel>
</rss>
