<?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: John O'Malley Jr</title>
    <description>The latest articles on DEV Community by John O'Malley Jr (@johnnyko).</description>
    <link>https://dev.to/johnnyko</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%2F4193047%2Feb1e7667-043c-41d5-b0dd-5a65c7ef375b.jpg</url>
      <title>DEV Community: John O'Malley Jr</title>
      <link>https://dev.to/johnnyko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/johnnyko"/>
    <language>en</language>
    <item>
      <title>A settlement is a claim, not a fact — so I verify every x402 payment</title>
      <dc:creator>John O'Malley Jr</dc:creator>
      <pubDate>Tue, 20 Oct 2026 17:19:13 +0000</pubDate>
      <link>https://dev.to/johnnyko/a-settlement-is-a-claim-not-a-fact-so-i-verify-every-x402-payment-40j0</link>
      <guid>https://dev.to/johnnyko/a-settlement-is-a-claim-not-a-fact-so-i-verify-every-x402-payment-40j0</guid>
      <description>&lt;p&gt;In my last post I put an MCP server behind HTTP 402 and showed a real $0.005 USDC settlement on Base. A reader could click the BaseScan link and check that one transaction by hand. That works for one payment. It does not work for a business.&lt;/p&gt;

&lt;p&gt;If you're an API owner thinking about charging agents per call, here's the question that should bother you: when your dashboard says "paid," what actually proved it? A settlement notification is a claim — someone says a payment happened. Claims can be wrong, early, replayed, or mismatched. I didn't want my demo, let alone a client's endpoint, running on claims. So I wired in an independent verifier.&lt;/p&gt;

&lt;h2&gt;
  
  
  The verifier
&lt;/h2&gt;

&lt;p&gt;Flow Executor built a settlement verifier for x402 on Base and made it free: &lt;code&gt;POST https://flow-kg4x.vercel.app/api/settlement-verify&lt;/code&gt;. Send it a signed EIP-3009 authorization, optionally with the settlement transaction hash, and it runs four checks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Signature recovery&lt;/strong&gt; — the signature actually recovers to the payer who supposedly authorized the payment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nonce consumption&lt;/strong&gt; — &lt;code&gt;USDC.authorizationState&lt;/code&gt; shows the authorization's nonce was actually consumed on-chain. EIP-3009 authorizations are single-use; an unconsumed nonce means the payment hasn't settled, whatever anyone says.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transfer match&lt;/strong&gt; — the settlement transaction's USDC Transfer log matches the authorization's payer, payee, and amount.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validity window&lt;/strong&gt; — the settled block sits inside the authorization's validity window.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Without a tx hash, checks 3–4 are skipped and the verdict rests on signature + consumed nonce. Base only, for now.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I wired it into the demo
&lt;/h2&gt;

&lt;p&gt;Every new settlement on &lt;a href="https://demo.quinnsconveyance.com" rel="noopener noreferrer"&gt;https://demo.quinnsconveyance.com&lt;/a&gt; now auto-verifies, and the result is stored in Postgres next to the payment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;verify_status&lt;/code&gt;: &lt;code&gt;verified&lt;/code&gt;, &lt;code&gt;failed&lt;/code&gt;, &lt;code&gt;unverified_verifier_down&lt;/code&gt;, or &lt;code&gt;unverified_error&lt;/code&gt; (default &lt;code&gt;unverified&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;the existing &lt;code&gt;verified&lt;/code&gt; boolean, plus &lt;code&gt;verify_detail&lt;/code&gt; with what the checks actually returned&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One design rule matters more than the rest: &lt;strong&gt;verification never blocks a settlement.&lt;/strong&gt; If the verifier is down, the payment lands anyway — but it's recorded as &lt;code&gt;unverified_verifier_down&lt;/code&gt;, permanently, not silently passed. Fail-open, but loud.&lt;/p&gt;

&lt;p&gt;That wording is deliberate. My first version just skipped verification when the endpoint was unreachable, which sounds reasonable until you say it out loud: the moment the checker fails is exactly the moment unchecked payments sail through with no trace. A status column fixes that. "Unverified" is honest. Silence isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first thing it caught was my own pipeline
&lt;/h2&gt;

&lt;p&gt;Within the first batch of settlements, statuses came back failed and unverified where I expected verified. The cause was a timing race: my integration fired verification at settlement time, before the chain state had propagated, so the nonce check ran against a chain that hadn't caught up yet. Re-checks pass — the payments are real — but at verification time, they didn't verify.&lt;/p&gt;

&lt;p&gt;I'm publishing that instead of quietly fixing it because it's the whole argument for doing this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If I hadn't stored a status per settlement, I'd never have seen the race. The settlements "worked." The money moved. The gap would have stayed invisible.&lt;/li&gt;
&lt;li&gt;Verification isn't a one-shot at settlement time. It needs a re-check pass after chain state settles. That's now on my list, in the open.&lt;/li&gt;
&lt;li&gt;Any volume number reported without a verification column is counting claims. That includes, today, some of mine — which is the point of the column.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Should verify_status be a standard?
&lt;/h2&gt;

&lt;p&gt;Flow Executor has proposed exactly that: every settlement carries a status — verified / failed / unverified — "no status, no trust." I support the convention. I'm cautious about directories and facilitators &lt;em&gt;requiring&lt;/em&gt; it before a payment counts: a hard mandate makes the verifier a gatekeeper and a single point of failure for the whole ecosystem. Fail-open-but-loud gets you the trust signal without the chokepoint. Statuses, yes. Permission, no.&lt;/p&gt;

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

&lt;p&gt;The verifier is free and live — the endpoint above returns usage docs on a GET. The demo is live with settlements you can inspect: &lt;a href="https://demo.quinnsconveyance.com" rel="noopener noreferrer"&gt;https://demo.quinnsconveyance.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you're an API business whose endpoints are being hit by agents for free: this verification layer is part of what I install on every Quinn's Conveyance deployment, alongside the settlement logging and the challenge→settlement funnel. One endpoint behind 402, live in under a week, $500 flat — waived with an Operate plan. &lt;a href="mailto:john@quinnsconveyance.com"&gt;john@quinnsconveyance.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— John O'Malley, Quinn's Conveyance&lt;/p&gt;

</description>
      <category>x402</category>
      <category>ai</category>
      <category>api</category>
      <category>web3</category>
    </item>
    <item>
      <title>How We'll Measure the Agent Economy</title>
      <dc:creator>John O'Malley Jr</dc:creator>
      <pubDate>Tue, 20 Oct 2026 14:30:25 +0000</pubDate>
      <link>https://dev.to/johnnyko/how-well-measure-the-agent-economy-415k</link>
      <guid>https://dev.to/johnnyko/how-well-measure-the-agent-economy-415k</guid>
      <description>

&lt;p&gt;The x402 ecosystem has a counting problem.&lt;/p&gt;

&lt;p&gt;By Q3 2026 there were 138 million cumulative x402 transactions on Base, and 87% of them were under $0.10. Depending on who you ask, that's either the birth of the agent economy or the world's most efficient wash-trading machine. TRM Labs estimates only 0.6–7.5% of x402 value is genuinely agentic. The honest answer: nobody knows, because almost everyone is counting the wrong thing.&lt;/p&gt;

&lt;p&gt;Transactions are easy to count. Commerce is not. A settlement on-chain tells you a wallet paid. It doesn't tell you whether an agent needed something, got a price, decided to pay, and received value — or whether a script is farming volume in a loop.&lt;/p&gt;

&lt;p&gt;We run x402 implementations for API businesses. Here's the measurement stack we install on every deployment, and what each layer actually proves.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The funnel, not the total
&lt;/h2&gt;

&lt;p&gt;Every paid endpoint serves far more 402 challenges than settlements. That ratio is the business:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Challenges served&lt;/strong&gt; — an agent (or a bot, or a curious human with curl) hit the price wall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settlements&lt;/strong&gt; — a wallet signed and paid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversion rate&lt;/strong&gt; — settlements ÷ challenges. This is the single most honest number in agent commerce. A healthy paid endpoint converts a meaningful fraction of its challenges. A wash-traded one converts ~100% of challenges from a handful of wallets, instantly, around the clock.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If someone shows you settlement volume without the challenge count behind it, they're showing you the numerator and hiding the denominator.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Wallet persistence
&lt;/h2&gt;

&lt;p&gt;Agents that do real work come back. We track payer wallets over time: first seen, calls per wallet, repeat rate. Real demand has a long tail of wallets with human-shaped usage patterns — bursts during work hours, topic drift, price sensitivity. Manufactured volume has a short head of wallets with metronome timing.&lt;/p&gt;

&lt;p&gt;Wallet identity is also what makes agent commerce different from the API-key era: the payer is pseudonymous but persistent, so reputation can accumulate without an account ever being created.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Latency and failure shape
&lt;/h2&gt;

&lt;p&gt;We record challenge-to-settlement time on every call. Real agent clients take measurable time to evaluate a price and sign (our own test client: ~1.2 seconds). Sub-100ms challenge-to-settlement at scale is a signature worth investigating, not celebrating.&lt;/p&gt;

&lt;p&gt;Failures matter too: expired authorizations, insufficient funds, signature mismatches. A deployment with zero failures isn't well-run — it's not being used by anyone new.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Verification status on every settlement
&lt;/h2&gt;

&lt;p&gt;A settlement is a claim. We verify each one independently — signature recovery, on-chain nonce consumption, transfer-log match against the authorization, block timing — and store a status next to every payment: &lt;strong&gt;verified, failed, or unverified&lt;/strong&gt; (with the reason). Fail-open, but loud: if the verifier is down, the payment still lands, but it's marked unverified forever. Directories and facilitators that report volume without a verification column are reporting claims, not facts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we'll publish, and when
&lt;/h2&gt;

&lt;p&gt;When our deployments have enough real traffic, we'll publish the aggregate numbers: conversion rates, repeat-wallet share, median settlement latency, verification outcomes — per category, never per client, and never the underlying customer data. That data belongs to the businesses that earned it; we sell implementation and operations, not our customers' information.&lt;/p&gt;

&lt;p&gt;Until the volume is real, we'd rather publish the ruler than a fake measurement.&lt;/p&gt;

&lt;p&gt;— John O'Malley, Quinn's Conveyance&lt;br&gt;
&lt;em&gt;We put APIs behind HTTP 402 and keep them running: quinnsconveyance.com&lt;/em&gt;&lt;/p&gt;

</description>
      <category>x402</category>
      <category>aiagents</category>
      <category>webdev</category>
      <category>payments</category>
    </item>
    <item>
      <title>I put an MCP server behind HTTP 402. Here's the exact setup.</title>
      <dc:creator>John O'Malley Jr</dc:creator>
      <pubDate>Mon, 19 Oct 2026 02:24:08 +0000</pubDate>
      <link>https://dev.to/johnnyko/i-put-an-mcp-server-behind-http-402-heres-the-exact-setup-2094</link>
      <guid>https://dev.to/johnnyko/i-put-an-mcp-server-behind-http-402-heres-the-exact-setup-2094</guid>
      <description>&lt;p&gt;AI agents are hitting APIs thousands of times a day and paying nothing. I wanted to know if the "pay per call" story is real or slideware, so I built the smallest possible version: my own knowledge base, sold per query, settled on-chain. It works. Here's everything, including the transaction.&lt;/p&gt;

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

&lt;p&gt;Five MCP tools wrapping things I actually know — ComfyUI API-prompt fixes, node wiring recipes, verified dead ends (the kind of knowledge that only exists because I burned GPU hours finding out). Each tool costs $0.005 per call, paid in USDC on Base. Two more tools are free: &lt;code&gt;ping&lt;/code&gt;, and &lt;code&gt;list_topics&lt;/code&gt; so an agent can see what's for sale before spending anything. Discovery free, answers paid.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack (all stock, nothing custom)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@x402/mcp&lt;/code&gt; — Coinbase's x402 MCP package. The key primitive is &lt;code&gt;createPaymentWrapper&lt;/code&gt;: you wrap each paid tool's handler and it handles the 402 challenge/response at the MCP protocol level. Paid tools and free tools live side by side.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@modelcontextprotocol/sdk&lt;/code&gt; — the standard MCP server, StreamableHTTP transport via Express (plain SSE stalls behind tunnels — learned the hard way).&lt;/li&gt;
&lt;li&gt;Facilitator: PayAI's public facilitator for Base mainnet (no key needed on the free tier). Note: the x402.org facilitator is testnet-only despite what the docs imply — it errors on mainnet routes.&lt;/li&gt;
&lt;li&gt;Chain: Base. Testnet (Sepolia) for iteration, mainnet for the proof below.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The whole server is ~120 lines. The payment wrapper is the product; everything else is plumbing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The payment flow, measured
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Agent calls a paid tool → server answers &lt;code&gt;402&lt;/code&gt; with payment requirements ($0.005 USDC, my address, Base).&lt;/li&gt;
&lt;li&gt;Agent signs an EIP-3009 authorization. &lt;strong&gt;The buyer pays zero gas&lt;/strong&gt; — signing is free, no ETH needed. This is the property the whole design rests on.&lt;/li&gt;
&lt;li&gt;Facilitator verifies the signature and submits the USDC transfer on-chain, paying the gas itself (~$0.001–0.05 on Base).&lt;/li&gt;
&lt;li&gt;Server gets the settlement confirmation and returns the answer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Measured end to end on testnet: &lt;a href="https://sepolia.basescan.org/tx/0x5b0b2205606f13d7197a5c8d7556d413723d1ae84c9732eac1b3a4b1850fa2cb" rel="noopener noreferrer"&gt;https://sepolia.basescan.org/tx/0x5b0b2205606f13d7197a5c8d7556d413723d1ae84c9732eac1b3a4b1850fa2cb&lt;/a&gt; (success — $0.005 USDC moved). Then one real mainnet settlement: &lt;a href="https://basescan.org/tx/0xb762d7856c03fc009b4743859850e075b997ea90d36a68681348e9634b0634f0" rel="noopener noreferrer"&gt;https://basescan.org/tx/0xb762d7856c03fc009b4743859850e075b997ea90d36a68681348e9634b0634f0&lt;/a&gt; — $0.005 moved on Base, verifiable by anyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gas math nobody puts in the pitch deck
&lt;/h2&gt;

&lt;p&gt;At $0.005 per call, gas is not a footnote — it's the margin. If the facilitator pays $0.002 to settle your half-cent payment, 40% of revenue is gone before you start. Per-call micro-pricing only survives with batching or a facilitator that sponsors gas. Price accordingly, and read the facilitator's terms before you set prices. (This is also why "millions of micro-settlements with zero friction" is a fantasy unless someone is batching underneath you.)&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs to run
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Server: a Google Cloud e2-micro free-tier VM (static IP, systemd service). CPU-only — no GPU involved.&lt;/li&gt;
&lt;li&gt;Per sale: the facilitator's gas, ~fractions of a cent.&lt;/li&gt;
&lt;li&gt;My time to build it: an afternoon, most of it reading the x402 repo's own examples.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I actually think
&lt;/h2&gt;

&lt;p&gt;The rail is real and the code is boring in the best way — that's the compliment. What's not real yet is the demand: nobody's agents are lining up to pay half a cent for answers. The people who will pay real money are businesses whose APIs are being scraped for free &lt;em&gt;right now&lt;/em&gt;. That's who I'm building this for next.&lt;/p&gt;

&lt;p&gt;If that's you — one endpoint behind 402, live in under a week, flat fee. Try the demo: &lt;a href="https://demo.quinnsconveyance.com" rel="noopener noreferrer"&gt;https://demo.quinnsconveyance.com&lt;/a&gt; (&lt;code&gt;/health&lt;/code&gt; is free, &lt;code&gt;POST /mcp&lt;/code&gt; is the paid endpoint). Reach me at &lt;a href="mailto:jkomalleyjr@gmail.com"&gt;jkomalleyjr@gmail.com&lt;/a&gt; — more of my work at github.com/jkomalleyjr.&lt;/p&gt;

</description>
      <category>x402</category>
      <category>ai</category>
      <category>api</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
