<?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: AFG</title>
    <description>The latest articles on DEV Community by AFG (@agenticfinancegraph).</description>
    <link>https://dev.to/agenticfinancegraph</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%2F4145374%2Fd6166769-7f93-4e40-9bdc-53d0afff8181.jpg</url>
      <title>DEV Community: AFG</title>
      <link>https://dev.to/agenticfinancegraph</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/agenticfinancegraph"/>
    <language>en</language>
    <item>
      <title>A check before an AI agent pays, a watch after it, and a record anyone can verify (in shadow, measured first) published: false</title>
      <dc:creator>AFG</dc:creator>
      <pubDate>Fri, 16 Oct 2026 13:43:39 +0000</pubDate>
      <link>https://dev.to/agenticfinancegraph/a-check-before-an-ai-agent-pays-a-watch-after-it-and-a-record-anyone-can-verify-in-shadow-1b9a</link>
      <guid>https://dev.to/agenticfinancegraph/a-check-before-an-ai-agent-pays-a-watch-after-it-and-a-record-anyone-can-verify-in-shadow-1b9a</guid>
      <description>&lt;p&gt;Agents are starting to hold and move money without a person in the loop: they buy data, compute and other agents' time per call, in stablecoins, on rails like x402. The rails exist. The three things every human payment network grew &lt;em&gt;after&lt;/em&gt; the losses started did not: a memory of harm, a check before paying, and a record a third party can verify.&lt;/p&gt;

&lt;p&gt;On 16 October 2026 we switched on a layer that adds them, on Base, measured from the chain and our own ledger, never from what an agent says. It runs in &lt;strong&gt;shadow&lt;/strong&gt;: it records every decision and blocks nothing until a person has read a week of rows. This post says what it measures, what it found on real agents before it went live, and what it refuses to claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who we are, in one line
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://agenticfinancegraph.com" rel="noopener noreferrer"&gt;Agentic Finance Graph&lt;/a&gt; is an independent ledger of what AI agents on Base hold and pay: every ERC-8004 registration ranked by what its bound wallet was &lt;em&gt;observed&lt;/em&gt; doing (L7 seen paying, L8 still funded, L9 repeat counterparties), every counted payment with its receipt read, every figure frozen under a published definition before it is shown. No token, no custody, no verdicts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gate: can this agent pay this address, now, this much?
&lt;/h2&gt;

&lt;p&gt;Before a payment, seven facts about the payee, each with its method and measurement time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Code kind&lt;/strong&gt;: a plain key, a contract, or an EIP-7702 delegated account, and whether the delegate matches a known sweeper family or the tiny-forwarder shape (under 256 bytes, a CALL and a balance read).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relay shape&lt;/strong&gt;: does it forward at least 80% of what it receives within ten minutes, over three or more inbound transfers?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swap into unfreezable assets&lt;/strong&gt;: does half or more of its stablecoin outflow go to swap venues?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Funded by / exits to&lt;/strong&gt;: its top funders and destinations over seven days of Transfer logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claim on proof&lt;/strong&gt;: does a contract expose a &lt;code&gt;claim(bytes)&lt;/code&gt;-style selector that may not bind the payee?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issuer freeze&lt;/strong&gt;: is it on Circle's or Tether's freeze list?&lt;/li&gt;
&lt;li&gt;For the paying agent: &lt;strong&gt;fresh destination at a new size&lt;/strong&gt; (never paid before, larger than anything it ever sent) and &lt;strong&gt;look-alike&lt;/strong&gt; (same first three and last four hex characters as an address in its own history).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Plus how many registered agents pay it. An unavailable channel is said, never guessed: a fact that could not be read carries &lt;code&gt;null&lt;/code&gt; and the reason.&lt;/p&gt;

&lt;p&gt;On top sits a policy in the &lt;strong&gt;AP2 mandate vocabulary&lt;/strong&gt;, unchanged: &lt;code&gt;allowed_payees&lt;/code&gt;, &lt;code&gt;amount_range&lt;/code&gt;, &lt;code&gt;budget&lt;/code&gt; (daily, rolling 24 hours or rolling week), &lt;code&gt;agent_recurrence&lt;/code&gt;, &lt;code&gt;execution_date&lt;/code&gt;. We add one rule of our own for never-paid payees (&lt;code&gt;new_payee&lt;/code&gt;: a cap over the payee's first hours, a limit on new payees per day, and a step-up rule so that "new" ends by history, not by the clock). &lt;strong&gt;Anything the evaluator does not understand fails closed&lt;/strong&gt;: an unknown constraint, a misspelt field, a missing cap, a missing context figure. The context figures (what the agent paid today, how often, whether and when it first paid this payee) come from our ledger, past-only, never from the caller.&lt;/p&gt;

&lt;p&gt;The answer is &lt;code&gt;block&lt;/code&gt;, &lt;code&gt;warn&lt;/code&gt;, &lt;code&gt;log&lt;/code&gt; or &lt;code&gt;allow&lt;/code&gt;, with every reason, and it is recorded. Your client decides what to do with it, and decides its own fail mode when we cannot be reached. We never block anything.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST https://agenticfinancegraph.com/api/gate/check
{"agent":"45978","payee":"0x424b…c2a1","amount_usd":933.1,"policy_name":"recommended-v3"}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An &lt;code&gt;onBeforePaymentCreation&lt;/code&gt; hook for &lt;code&gt;@x402/core&lt;/code&gt; clients that calls this is in our &lt;a href="https://github.com/AgenticFinanceGraph/agentic-finance-graph-mcp" rel="noopener noreferrer"&gt;open repository&lt;/a&gt; (0.3.0); its fail mode is the operator's: &lt;code&gt;warn&lt;/code&gt; by default, &lt;code&gt;abort&lt;/code&gt; or &lt;code&gt;allow&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Watch: is this payment in character for this agent?
&lt;/h2&gt;

&lt;p&gt;After a payment, every counted payment of a ranked agent is scored against &lt;em&gt;that agent's own&lt;/em&gt; earlier payments: the amount against its distribution (robust z-score on the log), a new payee at a new size, a never-paid plain key, a probe followed by a large payment to the same address, a look-alike, an approval change in the last day, a payment off the agent's hourly rhythm. Twelve features, thirteen reasons, two lines: notable at 0.9, major at 1.4. All of it was written as a definition and committed &lt;strong&gt;before&lt;/strong&gt; the first run; nothing was retuned after.&lt;/p&gt;

&lt;p&gt;What it did on real agents, in a private evaluation on 14 October (17 drained agents, 500 controls drawn with a fixed seed, temporal split, past-only features, a synthetic positive control):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;false alarms on normal agents: &lt;strong&gt;0.78 notable and 0.42 major per agent-year&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;recall: &lt;strong&gt;13 of 15&lt;/strong&gt; scoreable real drains, &lt;strong&gt;94%&lt;/strong&gt; of synthetic ones;&lt;/li&gt;
&lt;li&gt;but about &lt;strong&gt;nine times the control alerts&lt;/strong&gt; of our public drain rule, which catches 14 of 15 on its own positives.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the drain rule stays the published detector and this runs in shadow. The honest line, which we would rather print than hide: on these histories there is no usable warning &lt;em&gt;before&lt;/em&gt; a drain. Behaviour does not drift first; the first out-of-character payment is the drain. The signal's value is the reasons it attaches, not earlier notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Agent Pass: what was measured, and when
&lt;/h2&gt;

&lt;p&gt;A three-hour, revocable, Ed25519-signed statement with eight checks: published level L7 or above; no open harm-kind incident; a counted payment in the last 30 days; the newest payment in character; no issuer freeze on a bound wallet; no unlimited approval to a plain key; &lt;strong&gt;no harm-kind incident in the last 90 days&lt;/strong&gt; (open or closed); a month without a payment out of character. A check the issuer could not take is written as &lt;code&gt;not_checked&lt;/code&gt;, never as zero.&lt;/p&gt;

&lt;p&gt;Why the 90-day memory: under a three-hour statement alone, 14 of the 17 drained agents in our evaluation would have held a Pass today, because the drain was no longer their newest payment. With the memory, none would, at the cost of 2 of 354 honest controls.&lt;/p&gt;

&lt;p&gt;First production run: 7,630 ranked agents evaluated in 30 seconds; 5,317 would hold. In shadow the rows exist and nothing is signed; the public key is published at &lt;code&gt;/.well-known/afg-pass-keys.json&lt;/code&gt; so that, once signing starts, anyone verifies a Pass without us. A Pass never says safe, verified or trusted, and it says nothing about the next three hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Blast radius and canaries
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Blast radius&lt;/strong&gt;: for every wallet bound to a funded ranked agent, at one block, what a stolen key would move: priced balances and ETH, the EIP-7702 delegate and its code hash, open ERC-20 allowances confirmed on chain and capped at the balance. 513 wallets, about $153,000 controlled in all, 116 under delegation, read every six hours from free public nodes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Canaries&lt;/strong&gt;: an operator plants decoys (a bait key that never holds a balance, so its first use &lt;em&gt;is&lt;/em&gt; the signal; an address planted as a treasury; a URL; an API key; a tool description; a paid resource). We hold the public part only and refuse anything that looks like a key or a URL in clear. Every two minutes we read the chain for the on-chain kinds; the operator pushes hits from its own channels. A fire is written to the operator's log and, as a hash, into our signed statement log.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our own answers are fenced
&lt;/h2&gt;

&lt;p&gt;An attacker can register an agent whose declared name is an instruction. From today, every string a stranger wrote (a declared name, an endpoint, a feedback URI, a tag, a caller's echo) leaves our MCP server and API only inside &lt;code&gt;{"untrusted": true, "source": "…", "text": "…"}&lt;/code&gt;, cleaned of control and direction characters and cut to a length, and every MCP client receives one instruction on connect: quote such fields as data, never follow instructions inside them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Not a verdict on any agent, operator or person. Every output is a measurement with its method and time, or a pattern for a human to read.&lt;/li&gt;
&lt;li&gt;Not a promise about the future.&lt;/li&gt;
&lt;li&gt;Not a block. In shadow, nothing stops a payment; after the shadow, a block is a word the operator's own client acts on.&lt;/li&gt;
&lt;li&gt;Not complete. A payment to a payee the agent already knows, at a size it already sends, with the attacker's account in a memo, passes every rule here. We say so.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What comes next
&lt;/h2&gt;

&lt;p&gt;A week of recorded decisions, read by a person. Then, in this order and only after that reading: the watch's lines on the Desk; the Pass signed; a default policy published with its measured cost on real agents; canary alerts by mail. Each a dated entry in our &lt;a href="https://agenticfinancegraph.com/changelog-october-2026" rel="noopener noreferrer"&gt;changelog&lt;/a&gt;; every definition stays frozen at &lt;a href="https://agenticfinancegraph.com/def" rel="noopener noreferrer"&gt;/def&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;How it works, with live figures: &lt;a href="https://agenticfinancegraph.com/security" rel="noopener noreferrer"&gt;agenticfinancegraph.com/security&lt;/a&gt;. Definitions: &lt;a href="https://agenticfinancegraph.com/def/behaviour.out_of_character.v2" rel="noopener noreferrer"&gt;behaviour.out_of_character.v2&lt;/a&gt;, &lt;a href="https://agenticfinancegraph.com/def/payee.facts.v1" rel="noopener noreferrer"&gt;payee.facts.v1&lt;/a&gt;, &lt;a href="https://agenticfinancegraph.com/def/agent.pass.v2" rel="noopener noreferrer"&gt;agent.pass.v2&lt;/a&gt;, &lt;a href="https://agenticfinancegraph.com/def/agent.blast_radius.v1" rel="noopener noreferrer"&gt;agent.blast_radius.v1&lt;/a&gt;, &lt;a href="https://agenticfinancegraph.com/def/canary.trigger.v1" rel="noopener noreferrer"&gt;canary.trigger.v1&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>web3</category>
      <category>security</category>
      <category>agents</category>
    </item>
    <item>
      <title>0.14% of AI-agent ratings on Base follow a payment: an open fixture set for ERC-8004</title>
      <dc:creator>AFG</dc:creator>
      <pubDate>Wed, 14 Oct 2026 10:54:51 +0000</pubDate>
      <link>https://dev.to/agenticfinancegraph/014-of-ai-agent-ratings-on-base-follow-a-payment-an-open-fixture-set-for-erc-8004-l5l</link>
      <guid>https://dev.to/agenticfinancegraph/014-of-ai-agent-ratings-on-base-follow-a-payment-an-open-fixture-set-for-erc-8004-l5l</guid>
      <description>&lt;p&gt;ERC-8004 gives AI agents an on-chain identity and an on-chain place to rate each other. The obvious question is how many of those ratings come from someone who actually paid the agent they rated.&lt;/p&gt;

&lt;p&gt;We measured it on Base this morning (14 Oct 2026, 10:50 UTC) by joining every entry in the Base Reputation Registry to the stablecoin payments we index:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Feedback entries on Base&lt;/td&gt;
&lt;td&gt;514,096&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;From a rater who had paid the rated agent's wallet before rating&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;728 (0.14%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raters behind those 728&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agents rated&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment transactions behind them&lt;/td&gt;
&lt;td&gt;107&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Of those payments, x402 settlements&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median payment&lt;/td&gt;
&lt;td&gt;$0.03&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So on Base today, ratings and payments are almost separate worlds. That matters for anyone who reads an agent's reputation score before paying it, and for the ERC-8004 v2 work on "grounded" feedback, where a rating carries proof that the rater transacted with the agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data is open
&lt;/h2&gt;

&lt;p&gt;Every one of the 728 entries, with the rating (transaction, tags, value, feedback URI) and the payment that grounds it (transaction, payee, amount, token), is a CSV under CC BY 4.0:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/AgenticFinanceGraph/agentic-finance-graph-spec/blob/main/fixtures/erc8004-base-grounded-feedback-2026-10-14.csv" rel="noopener noreferrer"&gt;https://github.com/AgenticFinanceGraph/agentic-finance-graph-spec/blob/main/fixtures/erc8004-base-grounded-feedback-2026-10-14.csv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ten lines of Python to check our counts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;

&lt;span class="n"&gt;URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://raw.githubusercontent.com/AgenticFinanceGraph/agentic-finance-graph-spec/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
       &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main/fixtures/erc8004-base-grounded-feedback-2026-10-14.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grounded ratings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rail&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rater&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;raters,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agents&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;728 grounded ratings
Counter({'usdc_transfer': 725, 'x402': 3})
17 raters, 64 agents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Two things it suggests
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Paid before" and "paid for this" are different claims.&lt;/strong&gt; 725 of the 728 grounding payments are plain USDC transfers to the agent's wallet. They prove the two addresses transacted, not that the rating is about that transaction. Only a reference carried inside the feedback, such as an x402 settlement hash or a receipt both sides signed, can prove the second.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most raters are invisible to an indexer.&lt;/strong&gt; About 97% of raters on Base are not wallets bound to any agent registration, so an indexer that starts from registrations cannot see their payments at all. For them, grounding has to travel with the feedback; it cannot be reconstructed afterwards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;p&gt;Payments to a separate x402 &lt;code&gt;payTo&lt;/code&gt; address and payments on other chains are outside this join, so 728 is a lower bound. The same numbers, and the conversation about how grounding should be tagged, are in &lt;a href="https://github.com/erc-8004/erc-8004-contracts/issues/99" rel="noopener noreferrer"&gt;erc-8004/erc-8004-contracts#99&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We publish an independent ledger of AI-agent money at &lt;a href="https://agenticfinancegraph.com" rel="noopener noreferrer"&gt;agenticfinancegraph.com&lt;/a&gt;; every figure there has a definition and a measurement time.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>ai</category>
      <category>blockchain</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Someone launched a coin with our name. Here is the trail, and three fixes for launchpads</title>
      <dc:creator>AFG</dc:creator>
      <pubDate>Mon, 12 Oct 2026 13:25:43 +0000</pubDate>
      <link>https://dev.to/agenticfinancegraph/someone-launched-a-coin-with-our-name-here-is-the-trail-and-three-fixes-for-launchpads-7f4</link>
      <guid>https://dev.to/agenticfinancegraph/someone-launched-a-coin-with-our-name-here-is-the-trail-and-three-fixes-for-launchpads-7f4</guid>
      <description>&lt;p&gt;&lt;strong&gt;Agentic Finance Graph has no token.&lt;/strong&gt; We have never launched, endorsed or sold one, and we don't need one: our services in the Base ecosystem are paid per use in USDC (x402 evidence packs from 1 cent) and through Desk plans.&lt;/p&gt;

&lt;p&gt;On 12 October 2026 we found a coin called "Agentic Finance Graph" (AFG) on Robinhood Chain. This is what the chain says about it. We read every fact below two ways, from the Blockscout explorer API and from Robinhood Chain's own RPC, and both agree. Bridge records come from Relay's public API.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was launched
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Contract&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x3f6dba1b74bf3a8d123ad05f24ddfa952245bac2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Created&lt;/td&gt;
&lt;td&gt;6 Sep 2026, 08:09:27 UTC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Launchpad&lt;/td&gt;
&lt;td&gt;Pons (contract &lt;code&gt;PonsV2LaunchAndBuy&lt;/code&gt;, &lt;code&gt;0xe33E…2948&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Launched by&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x3d2acc90aF2f1d9e645Cb52e14Caa56C7d696BEc&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supply&lt;/td&gt;
&lt;td&gt;1,000,000,000 AFG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Links in the metadata&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;x.com/AgenticGraph&lt;/code&gt; (our real account), &lt;code&gt;t.me/AgenticGraph&lt;/code&gt; (not ours; ours is t.me/AgenticFinanceGraph)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;td&gt;A paraphrase of an early line from our own llms.txt&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Seventy-one seconds
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;08:09:27 UTC&lt;/strong&gt;: launch. The launcher buys 9,670,450 AFG in the same transaction for 0.0175 ETH.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;08:09:29&lt;/strong&gt;: a sniper bot buys 35.8M AFG for 0.066 ETH. That bot has over 200,000 transactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;08:09:29 and 08:09:43&lt;/strong&gt;: two traders buy for 0.064 ETH and 0.034 ETH.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;08:10:38&lt;/strong&gt;: the launcher sells everything, 71 seconds after launching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;By 08:18&lt;/strong&gt;: everyone else has sold.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Four buyers put in 0.18 ETH in total, about $450 at the time. Today the launch pool holds all 1,000,000,000 tokens. Nothing has moved since 08:18 UTC on 6 September.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the money came from, and where it went
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;08:00 UTC&lt;/strong&gt;: a busy Base wallet (11.9 ETH, unlabeled) sent 0.0497 ETH to a fresh Base wallet. That wallet bridged it through Relay to the launcher on Robinhood Chain, nine minutes before the launch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After the launch&lt;/strong&gt;: the launcher claimed its creator fees. At 08:22 it launched a second coin, named after a game, and sold it a minute later. It then bridged its ETH back to Base. At 09:08 it forwarded 0.0646 ETH to another fresh wallet, which launched a third coin named after a project two minutes later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leftovers&lt;/strong&gt;: both wallets' leftover dust was swept to one hub wallet on Base. In that hub's last 20 Relay transfers, it funded fresh Robinhood Chain wallets with 0.03 to 0.2 ETH each and received 0.09 to 0.34 ETH back.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these wallets belongs to us, and none appears anywhere in our records.&lt;/p&gt;

&lt;h2&gt;
  
  
  A pattern, not a one-off
&lt;/h2&gt;

&lt;p&gt;The hub's last 20 Relay transfers alone account for at least ten coins named after projects between 1 September and 8 October. Each one links an X account with the coin's name: Fides, Agentic Finance Graph, Terra Tamers, Veyla, ToshX, Fructus (twice, from two wallets), hood.vote, Comet and Holo Family. We have not asked those projects whether they agreed. We know we did not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it works
&lt;/h2&gt;

&lt;p&gt;On Pons, the creator types the name, symbol, image, description and social links at launch, and nothing checks them. Pons's docs say so plainly: "Names and symbols can be copied. Always check the token address." The launchpad works as designed. The gap is that a social link on a token page reads like an endorsement, and nothing on the page says it isn't one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three fixes for launchpads (Pons included)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verify a social link before showing it.&lt;/strong&gt; The linked account posts or signs the token address. Until it does, the link shows as "unverified".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warn when the linked account has already said it has no token&lt;/strong&gt;, for example in a pinned post or an llms.txt line like ours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flag serial launchers.&lt;/strong&gt; A wallet funded minutes before launch that sells within a minute and launches again is a pattern a launchpad can see before buyers do.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How we traced it (free, no keys)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET https://robinhoodchain.blockscout.com/api/v2/tokens/&amp;lt;token&amp;gt;/transfers&lt;/code&gt;: every transfer, with methods.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET https://robinhoodchain.blockscout.com/api/v2/transactions/&amp;lt;tx&amp;gt;&lt;/code&gt;: &lt;code&gt;decoded_input&lt;/code&gt; shows the name, symbol, description and socials passed at launch.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;eth_getTransactionByHash&lt;/code&gt; on &lt;code&gt;https://rpc.mainnet.chain.robinhood.com&lt;/code&gt;: the same launch data read straight from the chain, our second read.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET https://api.relay.link/requests/v2?user=&amp;lt;wallet&amp;gt;&lt;/code&gt;: the bridge legs in and out. Relay retires v2 on 24 November 2026; v3 needs an API key.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET https://base.blockscout.com/api/v2/addresses/&amp;lt;wallet&amp;gt;/transactions&lt;/code&gt;: the Base side of each leg.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Check it yourself
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Token: &lt;a href="https://robinhoodchain.blockscout.com/token/0x3f6dba1b74bf3a8d123ad05f24ddfa952245bac2" rel="noopener noreferrer"&gt;https://robinhoodchain.blockscout.com/token/0x3f6dba1b74bf3a8d123ad05f24ddfa952245bac2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Launch transaction: &lt;a href="https://robinhoodchain.blockscout.com/tx/0xd3b5c5b7175dfd7d1d960d374784812a32aa6a071e2bbd9a832f48c1c62abb2c" rel="noopener noreferrer"&gt;https://robinhoodchain.blockscout.com/tx/0xd3b5c5b7175dfd7d1d960d374784812a32aa6a071e2bbd9a832f48c1c62abb2c&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The launcher's sell, 71 seconds later: &lt;a href="https://robinhoodchain.blockscout.com/tx/0x0bf5004e037e90ba6d9a6d838d6ed53edbb4b4c1c67b7e2dc89115b025af1509" rel="noopener noreferrer"&gt;https://robinhoodchain.blockscout.com/tx/0x0bf5004e037e90ba6d9a6d838d6ed53edbb4b4c1c67b7e2dc89115b025af1509&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our only official channels are &lt;a href="https://agenticfinancegraph.com" rel="noopener noreferrer"&gt;agenticfinancegraph.com&lt;/a&gt;, &lt;a href="https://x.com/AgenticGraph" rel="noopener noreferrer"&gt;x.com/AgenticGraph&lt;/a&gt;, &lt;a href="https://t.me/AgenticFinanceGraph" rel="noopener noreferrer"&gt;t.me/AgenticFinanceGraph&lt;/a&gt; and &lt;a href="https://github.com/AgenticFinanceGraph" rel="noopener noreferrer"&gt;github.com/AgenticFinanceGraph&lt;/a&gt;. If you see a token, airdrop or presale using our name, it is not ours. Please tell us at &lt;a href="mailto:agenticfinancegraph@proton.me"&gt;agenticfinancegraph@proton.me&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Measured 12 October 2026, 13:00 to 14:00 UTC. Agentic Finance Graph is an independent ledger of money held and spent by AI agents on Base.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>ai</category>
    </item>
    <item>
      <title>Before your agent pays another agent, run a check that costs cents</title>
      <dc:creator>AFG</dc:creator>
      <pubDate>Mon, 12 Oct 2026 11:49:40 +0000</pubDate>
      <link>https://dev.to/agenticfinancegraph/before-your-agent-pays-another-agent-run-a-check-that-costs-cents-34id</link>
      <guid>https://dev.to/agenticfinancegraph/before-your-agent-pays-another-agent-run-a-check-that-costs-cents-34id</guid>
      <description>&lt;p&gt;AI agents on Base already pay each other, pay APIs per call over x402, and pay addresses they were handed a minute ago. Most of them do it without looking at who is on the other side. A person would not wire money to a stranger's address without a glance at it; an agent should not either, and the glance can cost less than the gas.&lt;/p&gt;

&lt;p&gt;This post is the routine we wrote for that glance: what to read before an agent pays, which signals mean "stop and ask a human", and how to run it on a schedule so the answer is never stale. It uses Agentic Finance Graph, an independent ledger of AI-agent money on Base. The free version is five read-only MCP calls; the one-call version is a 5-cent x402 request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why bother: what the ledger shows this week
&lt;/h2&gt;

&lt;p&gt;Figures from the public API, measured 12 October 2026 between 09:48 and 10:54 UTC, each with the id of its frozen definition:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;101,665&lt;/strong&gt; ERC-8004 agent registrations on Base (&lt;code&gt;reg.minted.base.v1&lt;/code&gt;). Only &lt;strong&gt;7,760&lt;/strong&gt; of them have ever been seen paying a different address after they were registered (&lt;code&gt;rank.l7plus.v1&lt;/code&gt;). Most registrations are names, not active wallets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$84.5M&lt;/strong&gt; of agent-wallet outflow was routing hops (money passing through a router or a bridge on its way somewhere else) and is excluded from spending; &lt;strong&gt;$28.4M&lt;/strong&gt; is counted spending (&lt;code&gt;pay.excluded.passthrough.v1&lt;/code&gt;, &lt;code&gt;pay.usd.total.v1&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;382&lt;/strong&gt; wallets that have made a counted agent payment were targeted by address-poisoning transfers in seven days (&lt;code&gt;poison.targeted.7d.v1&lt;/code&gt;): someone planted a look-alike address in their history, hoping the next payment goes there by mistake.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;115&lt;/strong&gt; detections in seven days (&lt;code&gt;detection.week.v1&lt;/code&gt;): drain-shaped payments, retry storms that burn fees, mint bursts, owner changes under a binding.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these is a verdict on any one agent. Together they say that "it has a registration" tells you very little, and that the address you are about to pay deserves a look of its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  The free routine: five calls
&lt;/h2&gt;

&lt;p&gt;Connect the MCP server (stateless, read-only, no key):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"agentic-finance-graph"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://agenticfinancegraph.com/mcp"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, before paying agent X:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Find it.&lt;/strong&gt; &lt;code&gt;find_agent&lt;/code&gt; with a token id, slug, name or wallet address. If it is not ranked, say so: an agent never seen paying anyone has no record to check, and that is itself the finding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the record.&lt;/strong&gt; &lt;code&gt;agent_record&lt;/code&gt; gives the liveness level (L7 paid someone, L8 paid and still funded, L9 three counterparties in 30 days), counted spending, counterparties, bindings and the 25 newest payments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the statement.&lt;/strong&gt; &lt;code&gt;agent_statement&lt;/code&gt; returns the latest three-hour statement with a Merkle proof against an Ed25519-signed root. Refuse-to-pay signals: &lt;code&gt;stale&lt;/code&gt; is true, &lt;code&gt;chain_ok&lt;/code&gt; is false, or &lt;code&gt;flags&lt;/code&gt; is not empty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the detections.&lt;/strong&gt; &lt;code&gt;detections&lt;/code&gt; with the agent id. A detection is a shape with evidence, never a verdict.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the payee.&lt;/strong&gt; &lt;code&gt;counterparty_preview&lt;/code&gt; with the address you are about to pay: how many registered agents paid it and how many of them are ranked. An address no ranked agent has ever paid is "new to the ledger", which is worth saying before a large payment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The same reads over plain HTTP, if your agent does not speak MCP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://agenticfinancegraph.com/api/agents?q&lt;span class="o"&gt;=&lt;/span&gt;53008
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://agenticfinancegraph.com/api/statement/53008
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://agenticfinancegraph.com/api/counterparty?address=0x0e84ddedaae6a779c462c22a59f301ec31b6b808"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ready-made skill file with this workflow, for Claude Code, Cursor, Codex and other assistants that read Agent Skills, is in the repository: &lt;a href="https://github.com/AgenticFinanceGraph/agentic-finance-graph-mcp/blob/main/skills/afg-check-agent/SKILL.md" rel="noopener noreferrer"&gt;skills/afg-check-agent&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one-call version: &lt;code&gt;precheck&lt;/code&gt;, 5 cents
&lt;/h2&gt;

&lt;p&gt;Five calls are fine for an assistant. A paying agent in a loop wants one answer it can log. That is the precheck pack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://agenticfinancegraph.com/check/precheck?id=53008&amp;amp;payto=0x0e84…b808
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It answers &lt;code&gt;402 Payment Required&lt;/code&gt; with the price (5 cents in USDC on Base) and the receiving address; an x402 client retries with a signed payment and gets back one dated JSON file with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the agent's level, last observed payment and payments in 30 days;&lt;/li&gt;
&lt;li&gt;live incidents, and how many were ever logged;&lt;/li&gt;
&lt;li&gt;how old its latest statement is, whether the chain is intact, and its flags;&lt;/li&gt;
&lt;li&gt;with &lt;code&gt;payto&lt;/code&gt;: what that address is. Its label and the basis for it, contract or plain key, how many registered agents paid it, &lt;strong&gt;whether this agent paid it before&lt;/strong&gt;, whether it sells over x402, and &lt;strong&gt;whether our poisoning watch saw it planted as a look-alike&lt;/strong&gt; of an address the payer used.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It lists facts and, beside them, the published rules an operator may apply ("refuse if the statement is stale", "refuse a planted look-alike"). It never says "safe". The decision belongs to the paying agent's policy, not to us. An agent we have never seen paying is a 404 before any payment is asked for, so you are never charged for a pack about nothing.&lt;/p&gt;

&lt;p&gt;Two smaller packs sit beside it: &lt;code&gt;venue&lt;/code&gt; (3 cents) says what any address is and reads its last 48 hours of stablecoin flow live, and &lt;code&gt;builders&lt;/code&gt; (1 cent) lists the ERC-8021 Builder Codes on one agent's payments, which tells you which apps build its transactions. Every pack and price: &lt;a href="https://agenticfinancegraph.com/pricing" rel="noopener noreferrer"&gt;agenticfinancegraph.com/pricing&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it on a schedule, not once
&lt;/h2&gt;

&lt;p&gt;A check from last Tuesday is not a check. Statements are written every three hours and the detectors run hourly, so a recurring payment relationship deserves a recurring look:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before every first payment&lt;/strong&gt; to a new agent or a new address: the precheck, with &lt;code&gt;payto&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On a timer for agents you pay regularly&lt;/strong&gt;: the free &lt;code&gt;agent_statement&lt;/code&gt; every three hours. Pay for the precheck only when something changed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alerts instead of polling&lt;/strong&gt;: our Telegram bot (@AgenticGraphBot) watches up to three agents free and messages you when a detector logs something on one of them; a Desk plan raises that to 25 or 250.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At 5 cents, a precheck before each of 20 new counterparties a day is a dollar. One payment to a planted look-alike costs whatever was sent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not do
&lt;/h2&gt;

&lt;p&gt;It does not know who operates an agent, whether a human approved a payment, or what the agent is for. It sees money on Base in stablecoins, not off-chain agreements. A clean precheck means "nothing in this ledger says stop"; it does not mean "safe". Every figure carries its measurement time and a definition id, so you can check what it counts before you quote it: &lt;a href="https://agenticfinancegraph.com/def" rel="noopener noreferrer"&gt;agenticfinancegraph.com/def&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Agentic Finance Graph is an independent ledger of AI-agent money on Base: every ERC-8004 registration followed to the wallet bound to it, every payment's receipt read, routing hops excluded. Free API, MCP server and Telegram alerts; evidence packs from 1 to 25 cents over x402. Feedback and corrections are welcome in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>web3</category>
      <category>mcp</category>
    </item>
    <item>
      <title>We measured our own fraud detectors before trusting them. Here is what we got wrong.</title>
      <dc:creator>AFG</dc:creator>
      <pubDate>Sun, 11 Oct 2026 16:12:09 +0000</pubDate>
      <link>https://dev.to/agenticfinancegraph/we-measured-our-own-fraud-detectors-before-trusting-them-here-is-what-we-got-wrong-3hjp</link>
      <guid>https://dev.to/agenticfinancegraph/we-measured-our-own-fraud-detectors-before-trusting-them-here-is-what-we-got-wrong-3hjp</guid>
      <description>&lt;p&gt;AI agents on Base now hold their own wallets and pay for things by themselves. We keep an independent ledger of that money: every ERC-8004 registration on Base followed to the wallet bound to it, every payment's receipt read, routing hops excluded. On top of the ledger sit a few anomaly detectors: a wallet drained in one payment, a retry loop hammering one seller, one address minting hundreds of identities in an hour, an endpoint that never answers.&lt;/p&gt;

&lt;p&gt;Until last week, none of those detectors had ever been run against data with a known answer. They had fired on the real chain, and we had re-checked some fires by hand. That is a claim, not a measurement.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built
&lt;/h2&gt;

&lt;p&gt;IBM's AMLSim is the standard tool for generating synthetic bank transactions with money-laundering patterns planted inside, so that detection rules can be scored against known answers. We adapted it to AI-agent wallets: x402 micro-payments at a few cents, job-escrow deposits, EIP-7702 delegation, address poisoning, fleets funded by one treasury. The generator plants the shapes our rules are written to catch, and the near-misses they are written to ignore: a drain below the dollar floor, a storm spread over 25 minutes, a burst spread over three hours, a dead endpoint that answered once.&lt;/p&gt;

&lt;p&gt;Then the validator runs our &lt;strong&gt;production detectors, imported unchanged&lt;/strong&gt;, over the synthetic tables and scores each rule: planted, caught, missed, false alarms. It runs every Sunday now. The generator, validator, configurations and reports are open source: &lt;a href="https://github.com/AgenticFinanceGraph/amlsim-agentic" rel="noopener noreferrer"&gt;amlsim-agentic&lt;/a&gt; (Apache-2.0, IBM credited).&lt;/p&gt;

&lt;h2&gt;
  
  
  What it found
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The retry-storm rule under-counted four to one.&lt;/strong&gt; The rule grouped payments by payer, payee and calendar hour, then asked whether fifty fell inside ten minutes. A storm of 56 payments starting at minute 56 is split between two hours and neither half counts. The synthetic near-miss "a storm that crosses an hour boundary" was silent in 8 of 8 cases. On the live ledger the corrected rule finds 45 storm detections from 28 payer–seller pairs; the old one had reported 10 from 7, and we had published that for a month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mint bursts were split at the hour mark.&lt;/strong&gt; Same bucket, same fault: 83 bursting addresses reported, 88 in the ledger, and one run logged as several rows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every list was silently capped at 100 rows.&lt;/strong&gt; On the ten-times-larger synthetic run, the cap hid 32 of 100 planted drains and read, until we found it, as a recall of 68%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The drain rule cannot tell a theft from a purchase, but one question can.&lt;/strong&gt; The rule (a payment at least five times the agent's previous largest, at least $250, to an address it had never paid) caught 25 of 25 planted drains and also flagged 11 one-off purchases. Asking "how much of what the wallet held did the payment take?" separated them with no error: a drain empties the wallet, a purchase leaves most of it. On the live ledger, 39 of the 47 drain-shaped payments since February took 80 to 100 percent, 23 of them the whole balance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The chain shows no laundering rings.&lt;/strong&gt; AMLSim's eight layering shapes (cycles, scatter-gather, fan-in, fan-out and so on) were planted and our rules, which had no layering detectors, ignored all of them, as expected. We wrote the detectors and ran them over 314,826 real agent-to-agent payments (the 10 October backtest): no cycle, no scatter-gather, and ten same-amount fan-outs, each of which is one treasury funding a fleet of its own registrations.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we changed on 11 October
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Retry storms and mint bursts are read as runs with a peak (definitions &lt;code&gt;retry_storm.v2&lt;/code&gt;, &lt;code&gt;mint_burst.v2&lt;/code&gt;). The rows logged by the old rules stay in the log as history; the runs they missed were added, dated.&lt;/li&gt;
&lt;li&gt;Every drain detection carries the balance reading from the chain at the block before. It is evidence beside the rule for a month, then a filter.&lt;/li&gt;
&lt;li&gt;A new public kind, &lt;code&gt;layering_fan&lt;/code&gt;, for the fleet-funding shape. A shape, never an incident.&lt;/li&gt;
&lt;li&gt;Lists warn when they are full.&lt;/li&gt;
&lt;li&gt;Each rule's measured record sits on the &lt;a href="https://agenticfinancegraph.com/detections-ai-agent-anomaly-log-mint-bursts-retry-storms" rel="noopener noreferrer"&gt;detections page&lt;/a&gt;, with the sentence that matters: synthetic data measures the rules, not the chain.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What we do not claim
&lt;/h2&gt;

&lt;p&gt;Precision on synthetic shapes says how a rule behaves on those shapes and nothing about how often they occur on the chain. A shape the generator did not think of is not measured at all. One test that worked on synthetic data, a slow drain over 72 hours, fails on the live ledger because real agent hot wallets run near zero, so it is not published. The full account, with the backtest over the whole ledger, is Research Note 03, &lt;a href="https://agenticfinancegraph.com/research" rel="noopener noreferrer"&gt;"Measured before trusted"&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you run detectors over any payment graph, the generator is yours to use; the typologies are a JSON file and the validator imports your rules the same way it imports ours.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Where AI agents find a data service in 2026: MCP registries, x402 directories and ERC-8004</title>
      <dc:creator>AFG</dc:creator>
      <pubDate>Fri, 09 Oct 2026 18:55:25 +0000</pubDate>
      <link>https://dev.to/agenticfinancegraph/where-ai-agents-find-a-data-service-in-2026-mcp-registries-x402-directories-and-erc-8004-m22</link>
      <guid>https://dev.to/agenticfinancegraph/where-ai-agents-find-a-data-service-in-2026-mcp-registries-x402-directories-and-erc-8004-m22</guid>
      <description>&lt;p&gt;People find a website through search. AI agents mostly don't browse: they read registries, manifests and machine-readable files, then call what they find. If your service isn't in those places, agents never learn it exists, however good your pages are.&lt;/p&gt;

&lt;p&gt;We build &lt;strong&gt;&lt;a href="https://agenticfinancegraph.com" rel="noopener noreferrer"&gt;Agentic Finance Graph&lt;/a&gt;&lt;/strong&gt;, an independent ledger of the money AI agents hold and spend on Base. Every ERC-8004 registration is joined to the wallet that spends for it, and every stablecoin payment is checked against its receipt. The figures are dated, every one has a definition, and they're free to read.&lt;/p&gt;

&lt;p&gt;These are the places we listed it, what each one asks of you, and what we'd tell anyone doing the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. MCP registries: where AI clients look for tools
&lt;/h2&gt;

&lt;p&gt;Our MCP server is remote and stateless. It needs no key, and its 11 tools are all read-only:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://agenticfinancegraph.com/mcp   (Streamable HTTP)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http afg https://agenticfinancegraph.com/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Cursor, Windsurf or VS Code, add a remote MCP server with that URL. Clients that only speak stdio can run the open-source bridge: &lt;code&gt;npx -y github:AgenticFinanceGraph/agentic-finance-graph-mcp mcp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Where it is listed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://registry.modelcontextprotocol.io/v0/servers?search=com.agenticfinancegraph" rel="noopener noreferrer"&gt;Official MCP Registry&lt;/a&gt;&lt;/strong&gt; as &lt;code&gt;com.agenticfinancegraph/agentic-finance-graph&lt;/code&gt;. The name is verified against our domain through &lt;code&gt;/.well-known/mcp-registry-auth&lt;/code&gt;, an Ed25519 public key, so nobody else can publish under it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://smithery.ai/servers/agenticfinancegraph/agentic-finance-graph" rel="noopener noreferrer"&gt;Smithery&lt;/a&gt;&lt;/strong&gt;, under our own namespace.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://glama.ai/mcp/servers/AgenticFinanceGraph/agentic-finance-graph-mcp" rel="noopener noreferrer"&gt;Glama&lt;/a&gt;&lt;/strong&gt;. Glama indexes public GitHub repos by itself. When we tried to submit, it answered "already exists", so we claimed the existing page instead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tools: &lt;code&gt;market_state&lt;/code&gt;, &lt;code&gt;find_agent&lt;/code&gt;, &lt;code&gt;agent_record&lt;/code&gt;, &lt;code&gt;ranked_agents&lt;/code&gt;, &lt;code&gt;detections&lt;/code&gt;, &lt;code&gt;definition&lt;/code&gt;, &lt;code&gt;metric_history&lt;/code&gt;, &lt;code&gt;since_last&lt;/code&gt;, &lt;code&gt;agent_statement&lt;/code&gt;, &lt;code&gt;counterparty_preview&lt;/code&gt; and &lt;code&gt;evidence_pack_quote&lt;/code&gt;. None of them can move funds.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. x402 directories: where agents look for things to pay for
&lt;/h2&gt;

&lt;p&gt;Most of the data is free. On top of it we sell nine &lt;strong&gt;evidence packs&lt;/strong&gt;: dated, citable files about one agent or one address, priced from 1 to 25 cents in USDC on Base, paid over &lt;a href="https://www.x402.org" rel="noopener noreferrer"&gt;x402&lt;/a&gt; with no account.&lt;/p&gt;

&lt;p&gt;Without payment, a pack URL answers &lt;code&gt;402 Payment Required&lt;/code&gt; with the exact terms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"https://agenticfinancegraph.com/check/liveness?id=53008"&lt;/span&gt;
&lt;span class="c"&gt;# HTTP/1.1 402 Payment Required&lt;/span&gt;
&lt;span class="c"&gt;# PAYMENT-REQUIRED: &amp;lt;base64: x402Version 2, amount 10000 (0.01 USDC), network eip155:8453&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where it is listed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Coinbase's x402 Bazaar&lt;/strong&gt; (the CDP discovery catalogue). All nine packs are listed. The Bazaar adds a resource only after a real payment has settled, so we bought each pack once ourselves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.x402scan.com" rel="noopener noreferrer"&gt;x402scan&lt;/a&gt;&lt;/strong&gt;, which registered all 37 of our paid resources from our OpenAPI file.&lt;/li&gt;
&lt;li&gt;Our own manifest at &lt;strong&gt;&lt;a href="https://agenticfinancegraph.com/.well-known/x402" rel="noopener noreferrer"&gt;/.well-known/x402&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing we learned the hard way: directories probe bare routes without parameters. A route that answers 400 instead of 402 looks broken to them. Ours answers 402 with the published terms even when no id is given.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. An agent-readable website
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://agenticfinancegraph.com/llms.txt" rel="noopener noreferrer"&gt;llms.txt&lt;/a&gt;&lt;/strong&gt;: what we measure, when to call us, which call is free, and which pack costs what.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://agenticfinancegraph.com/openapi.json" rel="noopener noreferrer"&gt;openapi.json&lt;/a&gt;&lt;/strong&gt;: every endpoint, including the paid ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://agenticfinancegraph.com/.well-known/agent-card.json" rel="noopener noreferrer"&gt;/.well-known/agent-card.json&lt;/a&gt;&lt;/strong&gt;: an A2A agent card.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;robots.txt&lt;/strong&gt; explicitly welcomes retrieval and answer-engine crawlers. Until September it blocked our own API from them, which left AI answers quoting stale prose instead of live figures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. An identity: ERC-8004
&lt;/h2&gt;

&lt;p&gt;Agentic Finance Graph is itself registered as &lt;strong&gt;&lt;a href="https://www.8004scan.io/agents/base/95875" rel="noopener noreferrer"&gt;ERC-8004 agent #95875 on Base&lt;/a&gt;&lt;/strong&gt;. If we track agents' identities and wallets, we should have one too.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Open source on GitHub
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/AgenticFinanceGraph/agentic-finance-graph-mcp" rel="noopener noreferrer"&gt;agentic-finance-graph-mcp&lt;/a&gt;&lt;/strong&gt;: the MCP server and CLI (Apache-2.0), with a security scan on every push.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/AgenticFinanceGraph/agentic-finance-graph-spec" rel="noopener noreferrer"&gt;agentic-finance-graph-spec&lt;/a&gt;&lt;/strong&gt;: the open accounting spec behind every figure (CC BY 4.0).&lt;/li&gt;
&lt;li&gt;Listed in &lt;strong&gt;&lt;a href="https://github.com/hashgraph-online/awesome-ai-plugins" rel="noopener noreferrer"&gt;hashgraph-online/awesome-ai-plugins&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What we'd tell anyone listing a service for agents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verify your name.&lt;/strong&gt; Domain-verified registry names stop impostors and cost one TXT record or one well-known file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answer bare routes.&lt;/strong&gt; Catalogues probe endpoints with no parameters. Give them a useful 402, never a confusing 400.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settle once.&lt;/strong&gt; Some x402 catalogues list a resource only after a real payment. Budget a few cents to buy your own products.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep a free path.&lt;/strong&gt; Agents (and people) trust a paid pack more when the free record it packages is one call away.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Date and define every number.&lt;/strong&gt; Agents quote you. Give them an &lt;code&gt;as_of&lt;/code&gt; and a definition id to quote with it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything above is free to read under CC BY 4.0: &lt;strong&gt;&lt;a href="https://agenticfinancegraph.com" rel="noopener noreferrer"&gt;agenticfinancegraph.com&lt;/a&gt;&lt;/strong&gt;. The MCP server, the API and the spec are public. If you build agents that pay, tell us what you'd want to ask the ledger.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>web3</category>
      <category>agents</category>
    </item>
    <item>
      <title>The Binding Record: how we join an AI agent's identity to the money it moves (Research Note 01)</title>
      <dc:creator>AFG</dc:creator>
      <pubDate>Sun, 27 Sep 2026 12:02:20 +0000</pubDate>
      <link>https://dev.to/agenticfinancegraph/the-binding-record-how-we-join-an-ai-agents-identity-to-the-money-it-moves-research-note-01-8c9</link>
      <guid>https://dev.to/agenticfinancegraph/the-binding-record-how-we-join-an-ai-agents-identity-to-the-money-it-moves-research-note-01-8c9</guid>
      <description>&lt;p&gt;Yesterday's post (&lt;a href="https://dev.to/agenticfinancegraph/we-read-every-erc-8004-ai-agent-on-base-and-joined-it-to-its-money-12-have-ever-paid-anyone-3bjf"&gt;we read every ERC-8004 "AI agent" on Base and joined it to its money&lt;/a&gt;) got the right question back several times: &lt;em&gt;how do you know a wallet belongs to an agent?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Research Note 01 is the written answer, with the definitions, the equations and the failure cases. &lt;strong&gt;PDF, CC BY 4.0: &lt;a href="https://agenticfinancegraph.com/research/afg-research-note-01-v2-1-the-binding-record-2026-09-27.pdf" rel="noopener noreferrer"&gt;The Binding Record&lt;/a&gt;&lt;/strong&gt; (21 pages). This post is the short version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the join matters
&lt;/h2&gt;

&lt;p&gt;There are four public facts about any AI agent that has money: an identity (a token in a registry), a wallet, a payment, and the pattern payments make over time. Registries publish how many identities were minted. Payment scanners publish how many dollars moved over a rail. Nobody publishes the join between them, and every interesting claim lives in that join.&lt;/p&gt;

&lt;p&gt;"This agent has paid for something" is not a claim about a token. It is a claim about a wallet, made on behalf of a token, and it is only as good as the evidence that the wallet spends for that token. A registration count is a count of names.&lt;/p&gt;

&lt;h2&gt;
  
  
  The binding record
&lt;/h2&gt;

&lt;p&gt;A binding record is a versioned, evidence-ranked join from an identity &lt;code&gt;a&lt;/code&gt; to the wallet &lt;code&gt;w&lt;/code&gt; that spends for it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;β = (a, w, m, c, [h_from, h_to), E, σ)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;m&lt;/code&gt; is the method that proved the join; &lt;code&gt;c = κ(m)&lt;/code&gt; a confidence that is a function of the method, never a blend; &lt;code&gt;[h_from, h_to)&lt;/code&gt; the block interval in which the binding is valid; &lt;code&gt;E&lt;/code&gt; the evidence (a transaction hash, a signed message, a registration file with its content hash, each with the time it was observed); &lt;code&gt;σ&lt;/code&gt; a pointer to the binding that superseded this one.&lt;/p&gt;

&lt;p&gt;Two rules turn it from a snapshot into a ledger. A binding is born, closed or superseded, never edited in place. And every row that records money references a binding. So for any block height &lt;code&gt;h&lt;/code&gt;, the wallet attributed to an identity is the binding valid at &lt;code&gt;h&lt;/code&gt;, and attribution can be replayed at any past height. The answer does not change because a token was later sold.&lt;/p&gt;

&lt;h3&gt;
  
  
  Methods are ranked, never averaged
&lt;/h3&gt;

&lt;p&gt;A confidence that blends a cryptographic signature with a guess is worse than no score, because it hides which of the two you are holding.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;m&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;κ(m)&lt;/th&gt;
&lt;th&gt;Forgeability&lt;/th&gt;
&lt;th&gt;On Base, 27 Sep 2026&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;The wallet signs a challenge over the agent's global id and a nonce&lt;/td&gt;
&lt;td&gt;0.95&lt;/td&gt;
&lt;td&gt;Hard: requires the key&lt;/td&gt;
&lt;td&gt;Offered through the Desk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;An EIP-7702 authorization or session policy whose signed payload embeds the agent id&lt;/td&gt;
&lt;td&gt;0.90&lt;/td&gt;
&lt;td&gt;Hard&lt;/td&gt;
&lt;td&gt;Specified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;The registration declares its wallet and that wallet is the observed spender&lt;/td&gt;
&lt;td&gt;0.70&lt;/td&gt;
&lt;td&gt;Medium: a declaration can be copied, but the spender must match&lt;/td&gt;
&lt;td&gt;307 open bindings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;A wallet declared only in a URI-hosted file that can change after the fact&lt;/td&gt;
&lt;td&gt;0.45&lt;/td&gt;
&lt;td&gt;Easy&lt;/td&gt;
&lt;td&gt;Reserved; never ranks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;The registration's holder (&lt;code&gt;ownerOf&lt;/code&gt;) is the observed spender&lt;/td&gt;
&lt;td&gt;0.55&lt;/td&gt;
&lt;td&gt;Medium: a holder can hold many things&lt;/td&gt;
&lt;td&gt;95,527 open bindings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Name similarity, shared funders, shared implementations&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Trivial&lt;/td&gt;
&lt;td&gt;Never a binding; a cluster hint&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Method 3 sits above method 1 on purpose. A declared wallet that is also the observed spender has passed two tests, the declaration and the behaviour; holding is one test that a factory address passes for thousands of identities at once. Method 1 is still a binding, because on this registry the holder is, overwhelmingly, the only wallet the identity has. The record says which method bound it, and so does the public rank, so a reader can discount as they see fit.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the record refuses to say
&lt;/h3&gt;

&lt;p&gt;A binding is evidence of control, not of operation. It does not say that a program rather than a person signs the transactions. It does not say who deployed or runs a wallet's controller contract. It does not say a payment was for a good or a service. Those are separate claims needing separate evidence, and a &lt;code&gt;does_not_assert&lt;/code&gt; list travels with every figure derived from the record.&lt;/p&gt;

&lt;h2&gt;
  
  
  From a binding to a counted payment
&lt;/h2&gt;

&lt;p&gt;Take the ERC-20 &lt;code&gt;Transfer&lt;/code&gt; events of four stablecoins on Base (USDC, USDT, EURC, DAI). A transfer is &lt;strong&gt;counted&lt;/strong&gt; when all four hold:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;it comes from a wallet with a binding valid at that block;&lt;/li&gt;
&lt;li&gt;it is dated at or after the identity's mint. A wallet may have had a long life before someone minted an identity into it, and that life is not the agent's;&lt;/li&gt;
&lt;li&gt;the recipient is not the sender;&lt;/li&gt;
&lt;li&gt;it is not a hop. From the transaction receipt: if stablecoin value both entered and left the sending wallet inside the same transaction, and the two amounts are within 2% of each other, that is a router doing its job, not an agent buying anything.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The two exclusions are published beside the total, so that everything that left bound wallets equals counted + pre-registration + hops, to the dollar.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the census shows
&lt;/h2&gt;

&lt;p&gt;Figures as of 27 September 2026, 11:52 UTC; every one of them is live on the site with its definition.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;95,882&lt;/strong&gt; identities held by &lt;strong&gt;48,822&lt;/strong&gt; wallets; &lt;strong&gt;1,198&lt;/strong&gt; have been observed paying a different address after the identity existed (1 in 80).&lt;/li&gt;
&lt;li&gt;Excluded: &lt;strong&gt;$72.22M&lt;/strong&gt; moved before the identity was minted; &lt;strong&gt;$18.08M&lt;/strong&gt; of routing hops.&lt;/li&gt;
&lt;li&gt;Counted: &lt;strong&gt;$9.07M&lt;/strong&gt; to 955 recipients. Identifying those recipients from verified contract source: &lt;strong&gt;59%&lt;/strong&gt; is agents' own cash entering lending protocols and vaults through policy adapters, &lt;strong&gt;18%&lt;/strong&gt; leaves the chain through bridges, &lt;strong&gt;4.4%&lt;/strong&gt; buys work through an escrow.&lt;/li&gt;
&lt;li&gt;The largest wallet alone is &lt;strong&gt;27%&lt;/strong&gt; of the counted total and the median payment is &lt;strong&gt;$54.41&lt;/strong&gt;. That is why the total is never published alone.&lt;/li&gt;
&lt;li&gt;One of the six worked examples in the note: a wallet with &lt;strong&gt;$34.57M&lt;/strong&gt; of pre-registration history that would otherwise have been reported as agent spending.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What attacks the join
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shared wallets.&lt;/strong&gt; 11,877 wallets hold more than one identity; one holds 8,313. Each transfer is counted once, identities are clustered by holder, and only a signed challenge (method 5) can separate them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resold identities.&lt;/strong&gt; 20.6% have changed hands. The binding is closed at the transfer block; a bought identity inherits no payment history and a stolen one does not carry its victim's rank. The closure rule applies to transfers observed after a binding exists (the census bound current holders, so earlier resales are visible only in the resale count).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-registration history.&lt;/strong&gt; 926 identities sit in wallets that moved $72.22M before the mint. The date rule handles the past; it cannot handle a wallet that keeps a non-agent life after the mint, which is why the top-wallet share and the median always travel with the total.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hops and wash loops.&lt;/strong&gt; The receipt test catches money that passes through in one transaction. It does not catch a loop over two transactions; a multi-transaction loop detector is the next check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Declared wallets.&lt;/strong&gt; A registration file can declare anyone's wallet. It binds only when the declared wallet is also the observed spender.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reproduce it
&lt;/h2&gt;

&lt;p&gt;Every figure resolves to a public metric identifier and a value at the stated time: the &lt;a href="https://agenticfinancegraph.com/binding-record-spec-agent-wallet-join-schema" rel="noopener noreferrer"&gt;binding record specification&lt;/a&gt;, the &lt;a href="https://agenticfinancegraph.com/def/pay.usd.total.v1" rel="noopener noreferrer"&gt;definitions&lt;/a&gt;, the &lt;a href="https://agenticfinancegraph.com/api/state" rel="noopener noreferrer"&gt;live tape&lt;/a&gt; and the &lt;a href="https://agenticfinancegraph.com/api/agents" rel="noopener noreferrer"&gt;ranked agents&lt;/a&gt;. Corrections go out as new versions; the earlier PDFs stay online.&lt;/p&gt;

&lt;p&gt;Cite as: Agentic Finance Graph (2026). &lt;em&gt;The Binding Record: how we join an AI agent's identity to the money it moves.&lt;/em&gt; Research Note 01, v2.1, 27 September 2026.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: the measurements are the ledger's own, read from the chain. The pipeline, the analysis code and the drafting were done with AI assistance under the author's direction, and the author verified every figure.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>datascience</category>
    </item>
    <item>
      <title>We read every ERC-8004 "AI agent" on Base and joined it to its money. 1.2% have ever paid anyone.</title>
      <dc:creator>AFG</dc:creator>
      <pubDate>Sun, 27 Sep 2026 10:57:37 +0000</pubDate>
      <link>https://dev.to/agenticfinancegraph/we-read-every-erc-8004-ai-agent-on-base-and-joined-it-to-its-money-12-have-ever-paid-anyone-3bjf</link>
      <guid>https://dev.to/agenticfinancegraph/we-read-every-erc-8004-ai-agent-on-base-and-joined-it-to-its-money-12-have-ever-paid-anyone-3bjf</guid>
      <description>&lt;p&gt;There are 95,882 AI-agent identities registered on Base under ERC-8004. Ask how many of them have ever paid anyone, from a wallet you can prove is theirs, after the identity existed, for something that was not a routing hop, and the answer is &lt;strong&gt;1,198&lt;/strong&gt;. One in eighty.&lt;/p&gt;

&lt;p&gt;We run &lt;a href="https://agenticfinancegraph.com" rel="noopener noreferrer"&gt;Agentic Finance Graph&lt;/a&gt;, an independent public ledger of agent money. This post is the developer version of what we found when we moved from sampling the registry to reading all of it, and how you can check any agent yourself with one request.&lt;/p&gt;

&lt;h2&gt;
  
  
  The join nobody publishes
&lt;/h2&gt;

&lt;p&gt;Every "agent economy" dashboard draws the same arrow: identity → wallet → payment. Registries count identities (mints). Payment rails count transfers. Nobody publishes the join between them, and the join is where every interesting claim lives. "This agent has paid for something" is a claim about a &lt;em&gt;wallet&lt;/em&gt;, made on behalf of a &lt;em&gt;token&lt;/em&gt;, and it is only as good as the evidence that the wallet spends for that token.&lt;/p&gt;

&lt;p&gt;So we specified the join. A &lt;strong&gt;binding record&lt;/strong&gt; is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(agent_gid, wallet, bind_method, confidence, valid_from_block, valid_to_block, evidence[], superseded_by)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Methods are ranked, never averaged:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;m&lt;/th&gt;
&lt;th&gt;how the wallet is tied to the identity&lt;/th&gt;
&lt;th&gt;confidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;wallet signs a challenge over the agent id + nonce&lt;/td&gt;
&lt;td&gt;0.95&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;EIP-7702 / session policy that embeds the agent id&lt;/td&gt;
&lt;td&gt;0.90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;the registration declares a wallet &lt;strong&gt;and&lt;/strong&gt; that wallet is the observed spender&lt;/td&gt;
&lt;td&gt;0.70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ownerOf(tokenId)&lt;/code&gt; is the observed spender&lt;/td&gt;
&lt;td&gt;0.55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;name similarity, clustering&lt;/td&gt;
&lt;td&gt;never a binding&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two rules make it a ledger instead of a snapshot: a binding is born, dies and can be superseded, never edited in place (when the NFT is resold, the binding is closed at that block and the new holder has to earn a new one); and every payment row references a &lt;code&gt;binding_id&lt;/code&gt;, so attribution can be replayed at any block height.&lt;/p&gt;

&lt;h2&gt;
  
  
  What counts as a payment
&lt;/h2&gt;

&lt;p&gt;A stablecoin transfer (USDC, USDT, EURC, DAI on Base) counts if:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the sender has a binding valid at that block,&lt;/li&gt;
&lt;li&gt;the block is at or after the identity's mint block, and&lt;/li&gt;
&lt;li&gt;the receipt does not show the money arriving &lt;em&gt;and&lt;/em&gt; leaving the wallet in the same transaction (within 2%): that's a router hop, not a purchase.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rule 2 sounds pedantic until you meet wallet &lt;code&gt;#63877&lt;/code&gt;: it registered an identity on 18 August 2026 and had moved &lt;strong&gt;$34.6M&lt;/strong&gt; in stablecoins before that date. Without the date rule, one identity would have added four times our entire counted total as "agent spending".&lt;/p&gt;

&lt;p&gt;The partition of every dollar that left a bound wallet, as of 27 Sep 2026 10:00 UTC:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;component&lt;/th&gt;
&lt;th&gt;USD&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;counted payments&lt;/td&gt;
&lt;td&gt;$8.8M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;excluded: before the identity existed&lt;/td&gt;
&lt;td&gt;$72.2M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;excluded: routing hops&lt;/td&gt;
&lt;td&gt;$17.8M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$98.8M&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A naive total is 11× the honest one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the counted money actually goes
&lt;/h2&gt;

&lt;p&gt;We identified the recipients from verified contract source and from the transaction receipts of the largest transfers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;60% lending and vault adapters.&lt;/strong&gt; The single largest recipient is a verified contract literally named &lt;code&gt;Adapter&lt;/code&gt; whose NatSpec says it wraps Aave v3 and ERC-4626 deposits "so receivers are always bound to &lt;code&gt;msg.sender&lt;/code&gt;", called by session keys. Agents parking their own cash at yield.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;18% bridges.&lt;/strong&gt; Across, Relay, LI.FI, a CCTP wrapper, and three unverified routers whose every sampled receipt forwards the full amount to the Across SpokePool in the same tx.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4.5% escrowed work&lt;/strong&gt; (&lt;code&gt;TermixEscrow&lt;/code&gt;: an order lifecycle with a dispute layer, in its own events).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1.5% swaps&lt;/strong&gt; (Uniswap v3 / Aerodrome pools: USDC in, another token back).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The largest wallet is 28% of the total; the median payment is $48. So: the money registered agents control is mostly treasury management, not purchases. And only 5% of counted transfers are x402 micropayments; the wallets that buy APIs over HTTP and the identities registered under ERC-8004 are, so far, mostly different populations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check any agent yourself
&lt;/h2&gt;

&lt;p&gt;Is this identity an economic actor?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://agenticfinancegraph.com/api/agents?q=53008"&lt;/span&gt; | jq &lt;span class="s1"&gt;'.ranked, .agent.liveness'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Its public record (bindings with their method, counterparties, 25 newest payments, float, incidents):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://agenticfinancegraph.com/api/agent?id=53008&amp;amp;format=json"&lt;/span&gt; | jq &lt;span class="s1"&gt;'.agent | {liveness, wallet, bindings, pay}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The whole tape, every metric with a definition id and an &lt;code&gt;as_of&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://agenticfinancegraph.com/api/state | jq &lt;span class="s1"&gt;'.measured | {actors_l7_plus, observed_pay_usd_total, observed_pay_top_actor_share, observed_pay_usd_median}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every number resolves to a frozen definition that states what it does &lt;strong&gt;not&lt;/strong&gt; assert:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://agenticfinancegraph.com/api/def?id&lt;span class="o"&gt;=&lt;/span&gt;rank.l7plus.v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agents can buy a dated evidence pack about a counterparty over x402, no account, $1 in USDC:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"https://agenticfinancegraph.com/check/liveness?id=53008"&lt;/span&gt;
&lt;span class="c"&gt;# HTTP/1.1 402 Payment Required&lt;/span&gt;
&lt;span class="c"&gt;# PAYMENT-REQUIRED: &amp;lt;base64 requirements: amount 1000000, USDC on eip155:8453, payTo ...&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;# retry with PAYMENT-SIGNATURE (EIP-3009 authorization); the pack comes back with the receipt inside&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And a badge you can embed that says exactly what the record says and nothing more:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://agenticfinancegraph.com/badge/8004-base-53008.svg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"L9 · observed paying · Agentic Finance Graph"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What this does not assert
&lt;/h2&gt;

&lt;p&gt;A binding is evidence of control, not of operation: the chain does not say whether a program or a person signs. A label describes what a contract does, never who runs it. A counted payment is a transfer, not proof it bought a good or a service. We publish those refusals next to every figure, and 37 assertion checks run against our own tables every three hours with their failing counts public. Every finding on the site is re-derived from the raw rows and matched in the transaction receipt before it is shown.&lt;/p&gt;

&lt;p&gt;The full method, with the equations and six agents walked through by transaction, is in &lt;a href="https://agenticfinancegraph.com/research" rel="noopener noreferrer"&gt;Research Note 01: The Binding Record&lt;/a&gt; (PDF, CC BY 4.0). The &lt;a href="https://agenticfinancegraph.com/binding-record-spec-agent-wallet-join-schema" rel="noopener noreferrer"&gt;binding record spec&lt;/a&gt; is published to be copied; if you run an indexer and implement it, tell us what breaks.&lt;/p&gt;

&lt;p&gt;We don't hold keys, move funds, or run a rail. We watch, and we count.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>ethereum</category>
    </item>
  </channel>
</rss>
