<?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: Mr Hamlin</title>
    <description>The latest articles on DEV Community by Mr Hamlin (@mr_hamlin).</description>
    <link>https://dev.to/mr_hamlin</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3815462%2F608d44c9-7dbf-4f19-bf5c-211f31b318fb.jpg</url>
      <title>DEV Community: Mr Hamlin</title>
      <link>https://dev.to/mr_hamlin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mr_hamlin"/>
    <language>en</language>
    <item>
      <title>Spraay Gateway Now Accepts Credit Cards — 80+ API Endpoints, No Crypto Wallet Required</title>
      <dc:creator>Mr Hamlin</dc:creator>
      <pubDate>Fri, 08 May 2026 02:54:47 +0000</pubDate>
      <link>https://dev.to/mr_hamlin/spraay-gateway-now-accepts-credit-cards-80-api-endpoints-no-crypto-wallet-required-4dj3</link>
      <guid>https://dev.to/mr_hamlin/spraay-gateway-now-accepts-credit-cards-80-api-endpoints-no-crypto-wallet-required-4dj3</guid>
      <description>&lt;p&gt;I've been building &lt;a href="https://spraay.app" rel="noopener noreferrer"&gt;Spraay&lt;/a&gt; — a multi-chain payment gateway where AI agents pay per API call using the x402 protocol and USDC on Base. 88 endpoints across AI inference, batch payments, DeFi, oracle data, escrow, robotics, and more.&lt;/p&gt;

&lt;p&gt;The x402 model works great for crypto-native developers and autonomous agents. But I kept hearing the same thing from traditional devs:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"This looks useful, but I don't want to set up a wallet and buy USDC just to test your API."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Fair point. So today I'm launching a &lt;strong&gt;traditional subscription tier&lt;/strong&gt; alongside x402 — pay with a credit card, get an API key, start building.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Ways to Use Spraay
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pay-per-call (x402)&lt;/strong&gt; — No signup. Your agent pays USDC per request on Base. This is how autonomous agents use it. Prices range from $0.001 to $0.10 per call depending on the endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monthly subscription (Stripe)&lt;/strong&gt; — Sign up with your email, pay with a card, get an API key emailed to you. Add &lt;code&gt;X-API-Key&lt;/code&gt; to your requests and you're in.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Daily Calls&lt;/th&gt;
&lt;th&gt;Endpoints&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pay-per-call&lt;/td&gt;
&lt;td&gt;USDC per request&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;All 80+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starter&lt;/td&gt;
&lt;td&gt;$29/month&lt;/td&gt;
&lt;td&gt;1,000/day&lt;/td&gt;
&lt;td&gt;All 80+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$99/month&lt;/td&gt;
&lt;td&gt;10,000/day&lt;/td&gt;
&lt;td&gt;All 80+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both paths hit the same endpoints. Same data, same infrastructure, same uptime.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Get Access To
&lt;/h2&gt;

&lt;p&gt;Here's a sample of what's behind the gateway:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Inference&lt;/strong&gt; — 200+ models via OpenRouter + 43 models on Bittensor (OpenAI-compatible drop-in)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch Payments&lt;/strong&gt; — Send tokens to 200 recipients in one transaction across 15 chains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeFi&lt;/strong&gt; — Swap quotes and execution via Uniswap V3, cross-chain bridge quotes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Oracle&lt;/strong&gt; — Real-time token prices, gas prices, FX rates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search/RAG&lt;/strong&gt; — Web search, content extraction, Q&amp;amp;A with sources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU Compute&lt;/strong&gt; — Image generation, video, audio via Replicate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Wallets&lt;/strong&gt; — Provision ERC-4337 smart wallets for AI agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escrow&lt;/strong&gt; — Milestone-based conditional escrow contracts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robot Task Protocol&lt;/strong&gt; — Dispatch tasks to physical robots via x402&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plus:&lt;/strong&gt; Payroll, invoicing, KYC, audit trails, XMTP messaging, IPFS storage, cron scheduling, and more
Full docs at &lt;a href="https://docs.spraay.app" rel="noopener noreferrer"&gt;docs.spraay.app&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Subscriptions Work
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Pick a plan at &lt;a href="https://spraay.app/#pricing" rel="noopener noreferrer"&gt;spraay.app/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Enter your email → redirected to Stripe Checkout&lt;/li&gt;
&lt;li&gt;Pay → API key emailed to you instantly&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;X-API-Key: spry_your_key&lt;/code&gt; header to any request&lt;/li&gt;
&lt;li&gt;That's it — no 402 payment flow, no wallet, no USDC
Check your usage anytime:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-API-Key: spry_your_key"&lt;/span&gt; https://gateway.spraay.app/v1/auth/usage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rotate your key if compromised:&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;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-API-Key: spry_your_key"&lt;/span&gt; https://gateway.spraay.app/v1/auth/rotate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Manage billing through Stripe's customer portal — update card, change plans, cancel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Both Models?
&lt;/h2&gt;

&lt;p&gt;x402 is the future for agent-to-agent payments. An AI agent with a USDC balance can autonomously discover and pay for API calls without any human in the loop. That's powerful.&lt;/p&gt;

&lt;p&gt;But not every developer is building autonomous agents. Some just want to hit an oracle endpoint for price data, or run a batch payment from their backend. For them, a traditional API key is the fastest path.&lt;/p&gt;

&lt;p&gt;Spraay supports both — and the gateway doesn't care which one you use. If your request has an API key, it's validated and served. If it doesn't, the x402 payment flow kicks in. Same endpoints, same responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built on Base
&lt;/h2&gt;

&lt;p&gt;Everything runs on Base mainnet. The batch payment contract is verified at &lt;a href="https://basescan.org/address/0x1646452F98E36A3c9Cfc3eDD8868221E207B5eEC" rel="noopener noreferrer"&gt;&lt;code&gt;0x1646452F98E36A3c9Cfc3eDD8868221E207B5eEC&lt;/code&gt;&lt;/a&gt;. Part of the Base Build program.&lt;/p&gt;

&lt;p&gt;Recently merged into &lt;a href="https://github.com/google/adk-python" rel="noopener noreferrer"&gt;Google Agent Development Kit&lt;/a&gt; as an integration, and live on &lt;a href="https://smithery.ai/server/@plagtech/spraay-x402-mcp" rel="noopener noreferrer"&gt;Smithery&lt;/a&gt; as an MCP server with 60+ tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pricing &amp;amp; signup:&lt;/strong&gt; &lt;a href="https://spraay.app/#pricing" rel="noopener noreferrer"&gt;spraay.app/#pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://docs.spraay.app" rel="noopener noreferrer"&gt;docs.spraay.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gateway:&lt;/strong&gt; &lt;a href="https://gateway.spraay.app" rel="noopener noreferrer"&gt;gateway.spraay.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/plagtech" rel="noopener noreferrer"&gt;github.com/plagtech&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Twitter:&lt;/strong&gt; &lt;a href="https://twitter.com/Spraay_app" rel="noopener noreferrer"&gt;@Spraay_app&lt;/a&gt;
If you have questions, drop a comment or reach out on Twitter. Happy to walk through integration.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>api</category>
      <category>webdev</category>
      <category>ai</category>
      <category>crypto</category>
    </item>
    <item>
      <title>How to pay 100 agents in a single x402 call</title>
      <dc:creator>Mr Hamlin</dc:creator>
      <pubDate>Sat, 25 Apr 2026 04:51:15 +0000</pubDate>
      <link>https://dev.to/mr_hamlin/how-to-pay-100-agents-in-a-single-x402-call-1243</link>
      <guid>https://dev.to/mr_hamlin/how-to-pay-100-agents-in-a-single-x402-call-1243</guid>
      <description>&lt;p&gt;You're building an agent that pays for things. It pulls market data, hits an inference endpoint, fans out USDC to 50 freelancers, and writes a row to your database. Four steps.&lt;/p&gt;

&lt;p&gt;Three of those steps are one HTTP call each. The fourth — paying 50 people — is 50 transactions, 50 nonces to track, 50 places where something can fail halfway. Your "agent" spends 90% of its runtime managing payment loops.&lt;/p&gt;

&lt;p&gt;This is the part of the agent stack that nobody talks about. The x402 marketplace today is full of read-side services: Anthropic, OpenAI, CoinGecko, Exa, Perplexity. They give your agent inputs. None of them help your agent fan money outward.&lt;/p&gt;

&lt;p&gt;That's the gap I've been building into for the last few months. This post is a quick tour of why batch settlement matters, why it's the right primitive for the agent economy, and how to actually use it in your code right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost of doing it wrong
&lt;/h2&gt;

&lt;p&gt;Let's get specific. Say your agent needs to pay 50 USDC recipients on Base. Doing it the obvious way — one ERC-20 transfer per recipient — looks like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Transactions&lt;/th&gt;
&lt;th&gt;Total Gas&lt;/th&gt;
&lt;th&gt;Wall-Clock Time&lt;/th&gt;
&lt;th&gt;Failure Modes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;50 sequential transfers&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;~3,300,000&lt;/td&gt;
&lt;td&gt;60-120 seconds&lt;/td&gt;
&lt;td&gt;Per-tx revert, nonce gaps, RPC drops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50 parallel transfers&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;~3,300,000&lt;/td&gt;
&lt;td&gt;5-15 seconds&lt;/td&gt;
&lt;td&gt;Nonce conflicts, replacement underpriced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 batch call&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;~280,000&lt;/td&gt;
&lt;td&gt;2-3 seconds&lt;/td&gt;
&lt;td&gt;Atomic — all or none&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The batch path saves ~92% of the gas and roughly an order of magnitude on wall-clock time. More importantly, it's atomic: either all 50 transfers land in the same block, or none do. Your agent never has to reconcile partial state.&lt;/p&gt;

&lt;p&gt;If you've ever built a payroll system, an airdrop tool, a marketplace payout, or an AI agent that distributes rewards, you know exactly why this matters. Partial state is where bugs live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why x402 needs this primitive
&lt;/h2&gt;

&lt;p&gt;The x402 protocol is beautifully simple: a server responds with &lt;code&gt;402 Payment Required&lt;/code&gt;, the client attaches a payment proof, the server returns the resource. It works because each request is a single payment unit.&lt;/p&gt;

&lt;p&gt;But the agent economy isn't single-recipient. Real workflows look like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A research agent buys 10 different data sources for one report, then pays the user a share back.&lt;/li&gt;
&lt;li&gt;A trading agent settles fees to multiple liquidity providers in a single decision cycle.&lt;/li&gt;
&lt;li&gt;A supply chain agent pays a supplier, the carrier, and the inspector when an invoice clears.&lt;/li&gt;
&lt;li&gt;A DAO treasury agent distributes monthly payments to 200 contributors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of those workflows works &lt;em&gt;through&lt;/em&gt; x402, but the payment leg currently has to fall back to a non-x402 path — ethers, viem, custom batch contracts, or a centralized service. That's friction. And friction is where adoption dies.&lt;/p&gt;

&lt;p&gt;So I built the missing piece: an x402 endpoint that takes a list of recipients and amounts, and settles all of them in a single on-chain transaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The endpoint
&lt;/h2&gt;

&lt;p&gt;The Spraay gateway exposes batch settlement as a paid x402 resource. One call in, one transaction out, atomic across all recipients.&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://gateway.spraay.app/api/v1/batch/execute
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Request shape:&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;"token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USDC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sender"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xYourAgentWallet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recipients"&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="s2"&gt;"0xRecipient1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"0xRecipient2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"0xRecipient3"&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;"amounts"&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="s2"&gt;"1000000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"2500000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"750000"&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;Amounts are in token-base units (USDC has 6 decimals, so &lt;code&gt;1000000&lt;/code&gt; = 1 USDC). The cost is $0.02 in USDC paid via x402, regardless of recipient count — economics get better the more recipients you have.&lt;/p&gt;

&lt;p&gt;The endpoint hits a batch contract on Base (&lt;code&gt;0x1646452F98E36A3c9Cfc3eDD8868221E207B5eEC&lt;/code&gt;), which loops the transfers in a single transaction. Either every recipient gets paid in the same block, or the whole call reverts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calling it from an agent
&lt;/h2&gt;

&lt;p&gt;Any HTTP client that speaks x402 can hit this endpoint. The simplest path is the official &lt;code&gt;x402-fetch&lt;/code&gt; wrapper — it handles the 402 challenge automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;wrapFetchWithPayment&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x402-fetch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createWalletClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;privateKeyToAccount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem/accounts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem/chains&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;privateKeyToAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AGENT_PRIVATE_KEY&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createWalletClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;http&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchWithPayment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;wrapFetchWithPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchWithPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://gateway.spraay.app/api/v1/batch/execute&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USDC&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;recipients&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0xRecipient1...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0xRecipient2...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0xRecipient3...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;amounts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1000000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2500000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;750000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Batch tx hash:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;txHash&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the whole integration. Three recipients, fifty recipients, two hundred recipients — same code shape, same gas profile per call.&lt;/p&gt;

&lt;p&gt;If you're not using &lt;code&gt;x402-fetch&lt;/code&gt;, the manual flow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;POST&lt;/code&gt; to the endpoint with no payment header. You get back &lt;code&gt;402 Payment Required&lt;/code&gt; with a JSON body describing the price and the facilitator.&lt;/li&gt;
&lt;li&gt;Sign a USDC transfer authorization for the price ($0.02) to the &lt;code&gt;payTo&lt;/code&gt; address from the response.&lt;/li&gt;
&lt;li&gt;Re-&lt;code&gt;POST&lt;/code&gt; with the signature in the &lt;code&gt;X-PAYMENT&lt;/code&gt; header.&lt;/li&gt;
&lt;li&gt;Get back your batch result with the on-chain tx hash.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where this fits in a larger agent
&lt;/h2&gt;

&lt;p&gt;Batch settlement is most useful as a primitive that other things compose on top of. A few patterns I've seen agents use:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Periodic distribution.&lt;/strong&gt; A cron-driven agent that pulls revenue, splits it across stakeholders, and pays them out weekly. One batch call per cycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Marketplace payouts.&lt;/strong&gt; A listing platform agent that resolves orders end-of-day and pays sellers atomically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-hop settlement.&lt;/strong&gt; An agent that pays an LLM provider, a search provider, and a vector DB provider all from the same workflow's budget — batched so the user is charged once, atomically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent-to-agent commerce.&lt;/strong&gt; When agents subcontract work to other agents, the paying agent can settle the entire delegation tree in one call rather than chaining individual payments.&lt;/p&gt;

&lt;p&gt;The Spraay gateway has 90+ other x402 endpoints — agent wallet provisioning, on-chain DeFi positions, contract reads/writes, multi-chain RPC, AI inference (including a Bittensor drop-in at &lt;code&gt;/bittensor/v1&lt;/code&gt;), oracle data, and more — but batch settlement is the one that nothing else on the x402 marketplace currently offers. Everything else is competitive; this one is structurally unique.&lt;/p&gt;

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

&lt;p&gt;The simplest sanity test: hit the endpoint without payment and watch the 402 challenge come back.&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="nt"&gt;-X&lt;/span&gt; POST https://gateway.spraay.app/api/v1/batch/execute &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"token":"USDC","sender":"0x...","recipients":["0x..."],"amounts":["1000000"]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll get a &lt;code&gt;402 Payment Required&lt;/code&gt; response with the payment requirements. That confirms the endpoint is live and gated. From there, drop in &lt;code&gt;x402-fetch&lt;/code&gt; (or your favorite x402 client) and you're paying batch in five minutes.&lt;/p&gt;

&lt;p&gt;The endpoint works on Base mainnet today. If you're building anything that fans money outward — payroll, airdrops, multi-recipient agent workflows, marketplace payouts — give it a try and let me know what breaks. I read every reply.&lt;/p&gt;

&lt;p&gt;Discovery doc with the full endpoint catalog: &lt;code&gt;https://gateway.spraay.app/.well-known/x402.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Build something. Pay everyone. In one call.&lt;/p&gt;

&lt;p&gt;— &lt;a href="https://dev.to/mr_hamlin"&gt;@mr_hamlin&lt;/a&gt;&lt;/p&gt;

</description>
      <category>x402</category>
      <category>web3</category>
      <category>agents</category>
      <category>base</category>
    </item>
    <item>
      <title>How to Use Bittensor Like OpenAI (3 Lines of Code)</title>
      <dc:creator>Mr Hamlin</dc:creator>
      <pubDate>Thu, 09 Apr 2026 16:25:32 +0000</pubDate>
      <link>https://dev.to/mr_hamlin/how-to-use-bittensor-like-openai-3-lines-of-code-7c6</link>
      <guid>https://dev.to/mr_hamlin/how-to-use-bittensor-like-openai-3-lines-of-code-7c6</guid>
      <description>&lt;p&gt;Every OpenAI-compatible SDK works with Bittensor now. No wallet. No TAO. No subnet knowledge. Just one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://gateway.spraay.app/bittensor/v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. You're on decentralized AI.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://spraay.app/bittensor" rel="noopener noreferrer"&gt;Spraay Inference&lt;/a&gt; is a drop-in replacement for OpenAI's API that routes to Bittensor's decentralized AI network under the hood. Same &lt;code&gt;/v1/chat/completions&lt;/code&gt; endpoint, same request format, same SDK support.&lt;/p&gt;

&lt;p&gt;The difference: instead of hitting OpenAI's servers, your requests go to Subnet 64 (Chutes AI) — a decentralized network of GPU miners competing to serve the best inference. Every response is TEE-verified (Trusted Execution Environment), meaning you get cryptographic proof the model actually ran your prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;43+ models available today&lt;/strong&gt;, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DeepSeek V3.2, DeepSeek R1 (reasoning)&lt;/li&gt;
&lt;li&gt;Qwen3 32B, Qwen3 235B&lt;/li&gt;
&lt;li&gt;GPT-OSS 120B (OpenAI's open-source model)&lt;/li&gt;
&lt;li&gt;Mistral Small 3.1&lt;/li&gt;
&lt;li&gt;And many more&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why switch from OpenAI?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cost.&lt;/strong&gt; Bittensor inference runs 40-85% cheaper than centralized providers because miners compete on price. A typical DeepSeek V3 call costs ~$0.25/M input tokens vs OpenAI's $2.50/M for GPT-4o.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Openness.&lt;/strong&gt; Every model on Bittensor is open-source. No black boxes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Permissionless.&lt;/strong&gt; No one can revoke your access, change your pricing overnight, or censor your outputs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verifiable.&lt;/strong&gt; TEE verification means you can prove the model ran exactly as specified — important for agent pipelines where trust matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://gateway.spraay.app/bittensor/v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;not-needed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// x402 handles payment&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deepseek-ai/DeepSeek-V3-0324&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are a helpful assistant.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain how Bittensor's subnet architecture works.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Python works too:&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;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://gateway.spraay.app/bittensor/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not-needed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-ai/DeepSeek-R1-0528&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&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;role&lt;/span&gt;&lt;span class="sh"&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;user&lt;/span&gt;&lt;span class="sh"&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;content&lt;/span&gt;&lt;span class="sh"&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;What is proof of intelligence?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;cURL:&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;-X&lt;/span&gt; POST https://gateway.spraay.app/bittensor/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "Qwen/Qwen3-32B",
    "messages": [{"role": "user", "content": "Hello from Bittensor"}],
    "max_tokens": 256
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Available endpoints
&lt;/h2&gt;

&lt;p&gt;The API follows OpenAI's specification exactly:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/bittensor/v1/models&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;List all available models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/bittensor/v1/chat/completions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;Chat completions (streaming supported)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/bittensor/v1/images/generations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;Image generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/bittensor/v1/embeddings&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;Text embeddings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/bittensor/v1/health&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;Health check&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Streaming, function calling, structured output, and tool use all work as expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works under the hood
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your app (OpenAI SDK)
    ↓ standard HTTP request
Spraay Gateway (gateway.spraay.app)
    ↓ x402 payment verification
    ↓ model → provider routing
Bittensor Subnet 64 (Chutes AI)
    ↓ distributed across GPU miners
    ↓ TEE-verified execution
Response back to your app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Spraay x402 Gateway handles payment via the &lt;a href="https://www.x402.org/" rel="noopener noreferrer"&gt;x402 protocol&lt;/a&gt; — HTTP-native micropayments in USDC on Base. Agents can consume inference autonomously without API keys or accounts. This is designed for the agentic future where software pays for its own compute.&lt;/p&gt;

&lt;h2&gt;
  
  
  For AI agent developers
&lt;/h2&gt;

&lt;p&gt;If you're building autonomous agents with LangChain, CrewAI, AutoGPT, or any framework that uses OpenAI-compatible endpoints, Spraay Inference is the simplest way to put your agents on decentralized AI:&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="c1"&gt;# LangChain example
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatOpenAI&lt;/span&gt;

&lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://gateway.spraay.app/bittensor/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-ai/DeepSeek-V3.2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not-needed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Analyze the top Bittensor subnets by revenue&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;p&gt;The x402 payment model means your agent doesn't need a credit card, an account, or even a human in the loop. It pays per-request in USDC and gets inference back. That's the unlock for truly autonomous AI agents.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live playground&lt;/strong&gt; (no setup needed): &lt;a href="https://spraay.app/bittensor" rel="noopener noreferrer"&gt;spraay.app/bittensor&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gateway endpoint&lt;/strong&gt;: &lt;code&gt;gateway.spraay.app/bittensor/v1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spraay Protocol&lt;/strong&gt;: &lt;a href="https://spraay.app" rel="noopener noreferrer"&gt;spraay.app&lt;/a&gt; | &lt;a href="https://gateway.spraay.app" rel="noopener noreferrer"&gt;Gateway docs&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Spraay Inference is part of the &lt;a href="https://gateway.spraay.app" rel="noopener noreferrer"&gt;Spraay x402 Gateway&lt;/a&gt; — 88+ pay-per-call API endpoints for AI, payments, DeFi, and infrastructure on Base. Built for agents.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;$TAO 💧&lt;/em&gt;&lt;/p&gt;

</description>
      <category>openai</category>
      <category>bittensor</category>
      <category>tao</category>
      <category>web3</category>
    </item>
    <item>
      <title>I built a tool to send TAO to 100+ wallets in one transaction (Bittensor payouts)</title>
      <dc:creator>Mr Hamlin</dc:creator>
      <pubDate>Wed, 01 Apr 2026 21:01:17 +0000</pubDate>
      <link>https://dev.to/mr_hamlin/i-built-a-tool-to-send-tao-to-100-wallets-in-one-transaction-bittensor-payouts-4i60</link>
      <guid>https://dev.to/mr_hamlin/i-built-a-tool-to-send-tao-to-100-wallets-in-one-transaction-bittensor-payouts-4i60</guid>
      <description>&lt;p&gt;Bittensor subnet operators often need to send &lt;strong&gt;TAO payouts to multiple wallets&lt;/strong&gt; — miners, contributors, validators.&lt;/p&gt;

&lt;p&gt;Right now, most people are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sending transactions one by one&lt;/li&gt;
&lt;li&gt;writing custom scripts&lt;/li&gt;
&lt;li&gt;or dealing with error-prone payout flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built something simple:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;A way to batch TAO payouts in a single transaction&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 The problem: TAO payouts don’t scale well
&lt;/h2&gt;

&lt;p&gt;If you’re running a Bittensor subnet, you’ve probably run into this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you have a list of wallet addresses&lt;/li&gt;
&lt;li&gt;each one needs a payout&lt;/li&gt;
&lt;li&gt;you’re sending transactions manually or via scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This leads to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wasted time&lt;/li&gt;
&lt;li&gt;higher chance of mistakes&lt;/li&gt;
&lt;li&gt;poor scalability as your subnet grows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There wasn’t a clean, simple way to:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;send TAO to multiple wallets at once&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ The solution: TAO Batch Payouts
&lt;/h2&gt;

&lt;p&gt;I built a tool called:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;TAO Batch Payouts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;paste wallet addresses + amounts&lt;/li&gt;
&lt;li&gt;review the payouts&lt;/li&gt;
&lt;li&gt;send everything in &lt;strong&gt;one transaction&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No scripts. No manual sending.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 How it works
&lt;/h2&gt;

&lt;p&gt;The flow is intentionally simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Paste wallets + amounts (or upload CSV)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Review &amp;amp; Send&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Confirm the payouts&lt;/li&gt;
&lt;li&gt;Execute the batch transaction&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s it.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Example input
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5F3sa2TJ...freqmY4p 1.5
5Grwva...GkutQY     2.3
5FHneW...M694ty     0.75
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔍 Why this matters
&lt;/h2&gt;

&lt;p&gt;This isn’t just convenience — it solves a real pain in the Bittensor ecosystem:&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Batch payments
&lt;/h3&gt;

&lt;p&gt;Send to &lt;strong&gt;100+ wallets in one transaction&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Less manual work
&lt;/h3&gt;

&lt;p&gt;No more copy-paste wallet-by-wallet&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Fewer errors
&lt;/h3&gt;

&lt;p&gt;Review everything before sending&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Built for subnet operators
&lt;/h3&gt;

&lt;p&gt;Designed specifically for &lt;strong&gt;TAO distribution and rewards&lt;/strong&gt;&lt;/p&gt;




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

&lt;p&gt;👉 &lt;a href="https://spraay.app/tao-batch" rel="noopener noreferrer"&gt;https://spraay.app/tao-batch&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧾 Pricing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1% batch fee&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;applied at confirmation&lt;/li&gt;
&lt;li&gt;fully transparent before sending&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Under the hood
&lt;/h2&gt;

&lt;p&gt;This is powered by &lt;strong&gt;Spraay&lt;/strong&gt;, a multi-chain batch payment infrastructure.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;p&gt;👉 make &lt;strong&gt;multi-wallet crypto payouts&lt;/strong&gt; as easy as a single transaction&lt;/p&gt;




&lt;h2&gt;
  
  
  🤖 Bigger picture: programmable payments for AI agents
&lt;/h2&gt;

&lt;p&gt;This tool is just one piece of a larger direction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI agents making payments&lt;/li&gt;
&lt;li&gt;automated reward distribution&lt;/li&gt;
&lt;li&gt;machine-to-machine transactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Batch payouts are a foundational primitive for:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;agent-native payments + programmable finance&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Keywords (for devs searching this)
&lt;/h2&gt;

&lt;p&gt;If you’re here looking for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how to send TAO to multiple wallets&lt;/li&gt;
&lt;li&gt;batch crypto payments&lt;/li&gt;
&lt;li&gt;bittensor payouts automation&lt;/li&gt;
&lt;li&gt;distribute TAO rewards&lt;/li&gt;
&lt;li&gt;multi wallet crypto transactions&lt;/li&gt;
&lt;li&gt;bulk crypto payments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This tool was built for exactly that.&lt;/p&gt;




&lt;h2&gt;
  
  
  🙏 Feedback
&lt;/h2&gt;

&lt;p&gt;If you’re running a Bittensor subnet or dealing with TAO payouts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how are you handling payouts today?&lt;/li&gt;
&lt;li&gt;manual? scripts? something else?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Would love feedback or ideas.&lt;/p&gt;




&lt;h2&gt;
  
  
  👋 Closing
&lt;/h2&gt;

&lt;p&gt;This started as:&lt;/p&gt;

&lt;p&gt;👉 “there has to be an easier way to send payouts”&lt;/p&gt;

&lt;p&gt;And turned into a simple tool you can use right now.&lt;/p&gt;

&lt;p&gt;If it saves you time (or prevents one mistake), it’s doing its job.&lt;/p&gt;




&lt;p&gt;👉 &lt;a href="https://spraay.app/tao-batch" rel="noopener noreferrer"&gt;https://spraay.app/tao-batch&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bittensor</category>
      <category>tao</category>
      <category>ai</category>
      <category>payments</category>
    </item>
    <item>
      <title>🚀 I built an API where an AI agent can verify an invoice and pay it in USDC</title>
      <dc:creator>Mr Hamlin</dc:creator>
      <pubDate>Tue, 31 Mar 2026 20:57:38 +0000</pubDate>
      <link>https://dev.to/mr_hamlin/i-built-an-api-where-an-ai-agent-can-verify-an-invoice-and-pay-it-in-usdc-ej7</link>
      <guid>https://dev.to/mr_hamlin/i-built-an-api-where-an-ai-agent-can-verify-an-invoice-and-pay-it-in-usdc-ej7</guid>
      <description>&lt;p&gt;Most accounts payable workflows still look like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Someone emails a PDF invoice&lt;/li&gt;
&lt;li&gt;Someone checks it against a purchase order&lt;/li&gt;
&lt;li&gt;Someone approves it&lt;/li&gt;
&lt;li&gt;Someone logs into a bank and sends the payment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⏳ It takes days.&lt;br&gt;
💸 It costs money.&lt;br&gt;
🧠 It requires humans in the loop.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚡ So I built something simpler
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;An API where an AI agent can verify an invoice and pay a supplier in one flow.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No API keys.&lt;br&gt;
No accounts.&lt;br&gt;
Just &lt;strong&gt;pay per request&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 The idea
&lt;/h2&gt;

&lt;p&gt;Instead of humans doing invoice checks, an agent can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create PO → Submit invoice → Verify → Pay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;👉 From invoice → verified → paid in seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 The flow (3 calls that matter)
&lt;/h2&gt;

&lt;p&gt;Here’s the entire loop.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧾 1. Submit an invoice
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://gateway.spraay.app/api/v1/sctp/invoice &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "poId": "po_123",
    "supplierId": "sup_abc",
    "items": [
      {
        "description": "Resistor 10K x1000",
        "quantity": 1000,
        "unitPrice": 0.02
      }
    ],
    "total": 20.00
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ 2. Verify it (this is the interesting part)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://gateway.spraay.app/api/v1/sctp/invoice/verify &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"invoiceId": "inv_456"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  ⚡ Exact match (instant)
&lt;/h4&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"matched"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"verifiedBy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deterministic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"latencyMs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recommendation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"approve_payment"&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;h4&gt;
  
  
  🧠 Fuzzy match (AI reasoning)
&lt;/h4&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"partial_match"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"verifiedBy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ai"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"latencyMs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1340&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"discrepancies"&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="s2"&gt;"Description variation: 'Resistor 10K' vs 'Resistors 10KΩ (1000pc)'"&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;"recommendation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"approve_payment"&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;h3&gt;
  
  
  💸 3. Pay the supplier
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://gateway.spraay.app/api/v1/sctp/pay &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "invoiceId": "inv_456",
    "supplierId": "sup_abc",
    "amount": 20.00,
    "token": "USDC",
    "chain": "base"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Response
&lt;/h4&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"processing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"estimatedSettlement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~2s"&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;h2&gt;
  
  
  ⚙️ How it works
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;/verify&lt;/code&gt; endpoint uses a &lt;strong&gt;two-step system&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡ Fast path (~50ms)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deterministic checks&lt;/li&gt;
&lt;li&gt;Totals, quantities, prices&lt;/li&gt;
&lt;li&gt;Instant match → high confidence&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧠 Slow path (~1–2s)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;LLM reasoning for fuzzy cases&lt;/li&gt;
&lt;li&gt;Handles naming differences, rounding, inconsistencies&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Why this matters
&lt;/h2&gt;

&lt;p&gt;This isn’t just another API.&lt;/p&gt;

&lt;p&gt;It changes how financial workflows work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ No dashboards&lt;/li&gt;
&lt;li&gt;❌ No logins&lt;/li&gt;
&lt;li&gt;❌ No subscriptions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Programmable financial infrastructure that agents can use directly&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An AI agent can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;receive an invoice&lt;/li&gt;
&lt;li&gt;verify it&lt;/li&gt;
&lt;li&gt;decide based on confidence&lt;/li&gt;
&lt;li&gt;execute payment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All without a human.&lt;/p&gt;




&lt;h2&gt;
  
  
  👀 Who this is for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🤖 AI CFO / finance agents&lt;/li&gt;
&lt;li&gt;🪙 Crypto startups paying vendors&lt;/li&gt;
&lt;li&gt;🏛️ DAOs managing contributor payments&lt;/li&gt;
&lt;li&gt;🧑‍💻 Indie hackers automating ops&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 What this is (and isn’t)
&lt;/h2&gt;

&lt;p&gt;This is &lt;strong&gt;v0.1&lt;/strong&gt; of something I’m calling:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Supply Chain Task Protocol (SCTP)&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Right now it focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;invoices&lt;/li&gt;
&lt;li&gt;verification&lt;/li&gt;
&lt;li&gt;payments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Later, it may expand into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;escrow&lt;/li&gt;
&lt;li&gt;shipment tracking&lt;/li&gt;
&lt;li&gt;document verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…but only after this core loop is proven.&lt;/p&gt;




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

&lt;p&gt;👉 &lt;a href="https://gateway.spraay.app" rel="noopener noreferrer"&gt;https://gateway.spraay.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/plagtech/sctp" rel="noopener noreferrer"&gt;https://github.com/plagtech/sctp&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you're building AI agents and want to automate real-world workflows, I’d love feedback.&lt;/p&gt;

&lt;p&gt;This is one of those things that either clicks immediately…&lt;/p&gt;

&lt;p&gt;or sounds insane.&lt;/p&gt;

&lt;p&gt;I’m betting on the former.&lt;/p&gt;

</description>
      <category>supply</category>
      <category>workflow</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>The agentic economy isn't a whitepaper anymore. Here's what the numbers say: 250,000 AI Agents Are Live On-Chain.</title>
      <dc:creator>Mr Hamlin</dc:creator>
      <pubDate>Fri, 27 Mar 2026 02:47:02 +0000</pubDate>
      <link>https://dev.to/mr_hamlin/the-agentic-economy-isnt-a-whitepaper-anymore-heres-what-the-numbers-say-250000-ai-agents-are-13aa</link>
      <guid>https://dev.to/mr_hamlin/the-agentic-economy-isnt-a-whitepaper-anymore-heres-what-the-numbers-say-250000-ai-agents-are-13aa</guid>
      <description>&lt;p&gt;On March 9, 2026, Coinbase CEO Brian Armstrong posted five sentences that rattled the entire payments industry:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Very soon there are going to be more AI agents than humans making transactions. They can't open a bank account, but they can own a crypto wallet. Think about it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two weeks later, the data is starting to prove him right.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers Are Real Now
&lt;/h2&gt;

&lt;p&gt;Daily active on-chain AI agents crossed &lt;strong&gt;250,000&lt;/strong&gt; in early 2026 — a 400%+ increase from 2025. More than 68% of new DeFi protocols launched in Q1 2026 included at least one autonomous AI agent for trading or liquidity management. AI-powered agents now represent roughly 18% of total prediction market volume, outperforming human traders by 27% on accuracy.&lt;/p&gt;

&lt;p&gt;This isn't speculative anymore. The machines are transacting.&lt;/p&gt;

&lt;p&gt;Coinbase launched Agentic Wallets on February 11, 2026, via the x402 protocol — an open payment standard built for machine-to-machine transactions. By the time Armstrong made his post, the protocol had already processed over &lt;strong&gt;50 million transactions&lt;/strong&gt;. CZ, the founder of Binance, echoed the thesis the very next day: AI agents will make &lt;em&gt;millions of times&lt;/em&gt; more payments than humans, and they'll use crypto to do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Stablecoins Are the Default
&lt;/h2&gt;

&lt;p&gt;The reason agents are gravitating toward stablecoins isn't ideological — it's engineering.&lt;/p&gt;

&lt;p&gt;Traditional payment rails weren't built for this. Credit cards have minimum fees around $0.30 per transaction. Banks require KYC, government IDs, and human identity verification. AI agents can't satisfy any of those requirements. But they &lt;em&gt;can&lt;/em&gt; generate a cryptographic private key in milliseconds and start transacting globally.&lt;/p&gt;

&lt;p&gt;Stablecoins solve every friction point an autonomous agent faces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Programmability&lt;/strong&gt; — spending limits, conditional flows, and policies enforced at the wallet layer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always-on settlement&lt;/strong&gt; — blockchains don't close on weekends&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price stability&lt;/strong&gt; — agents can budget in USD terms without spot-crypto volatility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Micropayment economics&lt;/strong&gt; — fractions of a cent per API call, per data query, per task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CB Insights projects that stablecoins will transition from crypto-native trading tools to the &lt;strong&gt;settlement layer for agent-driven commerce&lt;/strong&gt; in 2026. Circle CEO Jeremy Allaire has called USDC the "best dollar API" for AI's global economic system. And the data backs it up — on-chain analysis shows USDC accounts for 98.6% of agent transactions on EVM chains and 99.7% on Solana within the x402 ecosystem.&lt;/p&gt;

&lt;p&gt;The stablecoin market has matured into a &lt;strong&gt;$46 trillion&lt;/strong&gt; annualized transaction volume economy. That's 20x PayPal and rivaling major card networks.&lt;/p&gt;

&lt;h2&gt;
  
  
  x402: HTTP for Money
&lt;/h2&gt;

&lt;p&gt;The protocol making all of this work is x402 — and it just got a major upgrade.&lt;/p&gt;

&lt;p&gt;x402 resurrects the long-dormant HTTP 402 "Payment Required" status code and turns it into a machine-readable payment negotiation layer. When an AI agent hits a paid endpoint, the server returns a 402 with payment details. The agent pays in USDC. Retries the request with a payment receipt header. No human intervention required.&lt;/p&gt;

&lt;p&gt;Here's the flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent requests a resource&lt;/li&gt;
&lt;li&gt;Server responds &lt;code&gt;402 Payment Required&lt;/code&gt; with price + recipient&lt;/li&gt;
&lt;li&gt;Agent signs and submits payment&lt;/li&gt;
&lt;li&gt;Agent retries with payment proof in the header&lt;/li&gt;
&lt;li&gt;Server delivers the resource&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No accounts. No subscriptions. No API keys. Just money moving at HTTP speed.&lt;/p&gt;

&lt;p&gt;On March 22, x402 V2 shipped — adding multi-chain support, wallet-based identity, dynamic payment recipients, and a fully modular SDK. Coinbase and Cloudflare co-founded the x402 Foundation to govern the standard. The protocol is now live on Base, Solana, Ethereum L2s, and even Etherlink (Tezos). Cloudflare integrated x402 into both its Agents SDK and MCP servers.&lt;/p&gt;

&lt;p&gt;The v1.0 spec freeze is targeted for Q3 2026, after which backward compatibility guarantees kick in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Identity Gap: KYA Is the New KYC
&lt;/h2&gt;

&lt;p&gt;But payments alone don't solve the full picture. If agents can transact freely, how do you know &lt;em&gt;who&lt;/em&gt; (or what) is behind each one?&lt;/p&gt;

&lt;p&gt;a16z's crypto research team frames it this way: the bottleneck for the agent economy has shifted from intelligence to identity. In financial services, non-human identities already outnumber human employees 96-to-1 — yet these identities remain "unbanked ghosts." Agents need cryptographically signed credentials that link them to their principal, their constraints, and their liability.&lt;/p&gt;

&lt;p&gt;Sam Altman's World project launched AgentKit on March 17 to address exactly this — a toolkit that lets AI agents carry zero-knowledge proof that a verified human is behind them. It integrates directly with x402, positioning World as the identity layer for the agentic web.&lt;/p&gt;

&lt;p&gt;The industry that built KYC infrastructure over decades now has months to figure out &lt;strong&gt;KYA&lt;/strong&gt; — Know Your Agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means for Builders
&lt;/h2&gt;

&lt;p&gt;If you're building in crypto right now, the signal is clear: the next wave of users isn't human.&lt;/p&gt;

&lt;p&gt;The infrastructure play is wide open. Consider what's needed:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payment rails&lt;/strong&gt; — x402 gateways, facilitators, and middleware that let any API accept stablecoin micropayments per request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent wallets&lt;/strong&gt; — programmable wallets with session keys, spending policies, and budget controls that don't require human authorization per transaction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identity and trust&lt;/strong&gt; — reputation systems and verifiable credentials for agents, so merchants and protocols can assess risk without blocking every non-human actor at the firewall.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Physical-world bridging&lt;/strong&gt; — as AI agents move from digital tasks to coordinating physical robots and IoT devices, payment protocols need to extend into hardware.&lt;/p&gt;

&lt;p&gt;I've been building in this exact space. &lt;a href="https://spraay.app" rel="noopener noreferrer"&gt;Spraay&lt;/a&gt; is a multi-chain batch payment protocol with a live x402 gateway at &lt;code&gt;gateway.spraay.app&lt;/code&gt; — 76+ paid endpoints across 13 chains, all accepting USDC micropayments per request. We just shipped Agent Wallets (Category 17) on Base mainnet, and we're working on the &lt;a href="https://github.com/plagtech/rtp-spec" rel="noopener noreferrer"&gt;Robot Task Protocol (RTP)&lt;/a&gt; — an open standard for AI agents to hire physical robots via x402 micropayments.&lt;/p&gt;

&lt;p&gt;The agentic economy is being built right now, in public, by independent builders. If you're waiting for a Fortune 500 company to hand you the playbook, you're already behind.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reality Check
&lt;/h2&gt;

&lt;p&gt;Let's be honest about where things stand. Despite the narrative momentum, x402's average daily transaction volume is still around $28,000, and analysts estimate roughly half of that is wash trading or self-dealing. The gap between the vision and the current volume is real.&lt;/p&gt;

&lt;p&gt;But as one analyst put it: the growth rate of the agent economy may be overestimated for the coming year, but its potential may be underestimated five years from now.&lt;/p&gt;

&lt;p&gt;250,000 daily active agents. $46 trillion in stablecoin volume. 50 million x402 transactions. Two of crypto's most prominent founders publicly declaring that machines will dominate financial transactions.&lt;/p&gt;

&lt;p&gt;The infrastructure layer is being poured. The question isn't &lt;em&gt;if&lt;/em&gt; agents will be the primary users of crypto — it's whether you'll be building the rails they run on, or watching from the sidelines.&lt;/p&gt;




&lt;p&gt;💧 &lt;strong&gt;Building in the agentic economy?&lt;/strong&gt; Check out &lt;a href="https://spraay.app" rel="noopener noreferrer"&gt;Spraay&lt;/a&gt; — batch payments, x402 gateway, agent wallets, and RTP across 13 chains. &lt;a href="https://docs.spraay.app" rel="noopener noreferrer"&gt;Docs&lt;/a&gt; | &lt;a href="https://smithery.ai/server/@plagtech/spraay-x402-mcp" rel="noopener noreferrer"&gt;MCP Server&lt;/a&gt; | &lt;a href="https://github.com/plagtech" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Follow me for daily posts on building crypto infrastructure for AI agents: &lt;a href="https://dev.to/mr_hamlin"&gt;@mr_hamlin on dev.to&lt;/a&gt; | &lt;a href="https://twitter.com/Spraay_app" rel="noopener noreferrer"&gt;@Spraay_app on X&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>web3</category>
      <category>ai</category>
      <category>stablecoins</category>
      <category>crypto</category>
    </item>
    <item>
      <title>I Just Gave AutoGPT the Ability to Send Crypto Payments</title>
      <dc:creator>Mr Hamlin</dc:creator>
      <pubDate>Tue, 24 Mar 2026 06:32:40 +0000</pubDate>
      <link>https://dev.to/mr_hamlin/i-just-gave-autogpt-the-ability-to-send-crypto-payments-27ge</link>
      <guid>https://dev.to/mr_hamlin/i-just-gave-autogpt-the-ability-to-send-crypto-payments-27ge</guid>
      <description>&lt;p&gt;AI agents are getting smarter every week. They can browse the web, write code, manage your calendar, and post on social media. But ask one to pay someone? That's where they hit a wall.&lt;/p&gt;

&lt;p&gt;I just opened &lt;a href="https://github.com/Significant-Gravitas/AutoGPT/pull/12533" rel="noopener noreferrer"&gt;PR #12533&lt;/a&gt; on AutoGPT — the biggest open-source AI agent platform on GitHub — adding native crypto payment blocks powered by &lt;a href="https://spraay.app" rel="noopener noreferrer"&gt;Spraay&lt;/a&gt;, the multi-chain batch payment gateway I've been building.&lt;/p&gt;

&lt;p&gt;This is the first crypto payment integration in AutoGPT's block ecosystem. Here's why it matters and how I built it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: AI agents can't pay for anything
&lt;/h2&gt;

&lt;p&gt;Think about it. AutoGPT can already:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scrape Reddit for trending topics and create video content&lt;/li&gt;
&lt;li&gt;Monitor your YouTube channel and auto-generate blog posts&lt;/li&gt;
&lt;li&gt;Manage GitHub issues and coordinate workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the moment an agent needs to compensate a freelancer, pay a bounty, or settle an invoice? It's stuck. There's no native payment rail.&lt;/p&gt;

&lt;p&gt;Traditional payment APIs (Stripe, PayPal) require KYC, bank accounts, and don't work well for autonomous systems. Crypto solves this — specifically stablecoins like USDC that don't fluctuate in value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter x402: HTTP meets crypto payments
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://x402.org" rel="noopener noreferrer"&gt;x402 protocol&lt;/a&gt; is elegantly simple. It extends HTTP with status code 402 (Payment Required) to let APIs accept USDC micropayments per request. No subscriptions. No invoices. Just pay-per-call.&lt;/p&gt;

&lt;p&gt;Spraay's gateway sits at &lt;code&gt;gateway.spraay.app&lt;/code&gt; and exposes 76+ paid endpoints across 13 blockchain networks. When an AI agent calls the API, it pays a fraction of a cent in USDC and gets the service done. That's the entire auth model.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built: 4 payment blocks
&lt;/h2&gt;

&lt;p&gt;AutoGPT's platform uses a modular "block" system. Each block performs a single action, and users chain them together visually to build agent workflows. I added four blocks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SpraayBatchPaymentBlock&lt;/strong&gt; — The flagship. Send payments to multiple recipients in a single on-chain transaction. One call, multiple payees, massive gas savings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SpraayTokenTransferBlock&lt;/strong&gt; — Simple one-to-one transfer. Agent pays someone. Done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SpraayGetBalanceBlock&lt;/strong&gt; — Check any wallet's token balance on any chain. Essential for pre-flight checks before sending payments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SpraayTransactionStatusBlock&lt;/strong&gt; — Track confirmation status. Lets agents wait for finality before proceeding in a workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The code: how AutoGPT blocks work
&lt;/h2&gt;

&lt;p&gt;AutoGPT blocks follow a clean pattern: a Python class inheriting from &lt;code&gt;Block&lt;/code&gt;, with typed input/output schemas and an async &lt;code&gt;run&lt;/code&gt; method. Here's a simplified look at the batch payment block:&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SpraayBatchPaymentBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Block&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BlockSchema&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;spraay_provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;credentials_field&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ChainNetwork&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SchemaField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Blockchain network to send payments on&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ChainNetwork&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;recipients&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SchemaField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;List of recipient wallet addresses&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;amounts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SchemaField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;List of amounts to send&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BlockSchema&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;transaction_hash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SchemaField&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
        &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SchemaField&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
        &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SchemaField&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;spraay_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/v1/batch/send&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;json_body&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;chain&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;input_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;recipients&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;input_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recipients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amounts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;input_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;amounts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;transaction_hash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;transaction_hash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&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;p&gt;The provider config uses AutoGPT's &lt;code&gt;ProviderBuilder&lt;/code&gt; for API key management:&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;from&lt;/span&gt; &lt;span class="n"&gt;backend.sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BlockCostType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ProviderBuilder&lt;/span&gt;

&lt;span class="n"&gt;spraay_provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;ProviderBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spraay&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with_api_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPRAAY_API_KEY&lt;/span&gt;&lt;span class="sh"&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;Spraay x402 Gateway API Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with_base_cost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BlockCostType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RUN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean, typed, testable. Every block includes &lt;code&gt;test_input&lt;/code&gt;, &lt;code&gt;test_output&lt;/code&gt;, and &lt;code&gt;test_mock&lt;/code&gt; so it plugs right into AutoGPT's test suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can build with this
&lt;/h2&gt;

&lt;p&gt;Once these blocks are merged, AutoGPT agents can do things like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Freelancer payroll agent&lt;/strong&gt; — Reads a Google Sheet of contractors, batch pays them all in USDC on Base. One transaction. Done weekly on a schedule.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bounty payer&lt;/strong&gt; — Monitors GitHub issues tagged &lt;code&gt;bounty&lt;/code&gt;. When a linked PR gets merged, it automatically pays the contributor's wallet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent-to-agent payments&lt;/strong&gt; — One agent hires another agent for a subtask and pays via x402. This is the foundation of an autonomous agent economy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conditional payment workflows&lt;/strong&gt; — Check balance → if sufficient funds → send batch payment → verify confirmation → log to Google Sheets. All without human intervention.&lt;/p&gt;

&lt;h2&gt;
  
  
  13 chains, one API
&lt;/h2&gt;

&lt;p&gt;The blocks support every chain Spraay runs on:&lt;/p&gt;

&lt;p&gt;Base, Ethereum, Arbitrum, Polygon, BNB Chain, Avalanche, Unichain, Plasma, BOB, Solana, Bittensor, Stacks, and Bitcoin.&lt;/p&gt;

&lt;p&gt;Each chain is a simple enum value. Switch from Base to Solana by changing one field. The gateway handles all the chain-specific logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open source this into AutoGPT?
&lt;/h2&gt;

&lt;p&gt;Visibility and ecosystem growth. AutoGPT has 183K stars and an active contributor community. Getting payment blocks into their marketplace means every AutoGPT user can add crypto payments to their agents without writing custom code.&lt;/p&gt;

&lt;p&gt;It's also a signal. AI agents handling money is inevitable. The infrastructure should be open, auditable, and composable — not locked behind proprietary APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The PR is live at &lt;a href="https://github.com/Significant-Gravitas/AutoGPT/pull/12533" rel="noopener noreferrer"&gt;#12533&lt;/a&gt;. If you're interested in AI agent payments, here are some links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spraay gateway&lt;/strong&gt;: &lt;a href="https://gateway.spraay.app" rel="noopener noreferrer"&gt;gateway.spraay.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs&lt;/strong&gt;: &lt;a href="https://docs.spraay.app" rel="noopener noreferrer"&gt;docs.spraay.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server&lt;/strong&gt; (for Claude, Cursor, etc.): &lt;a href="https://smithery.ai/server/@plagtech/spraay-x402-mcp" rel="noopener noreferrer"&gt;@plagtech/spraay-x402-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/plagtech" rel="noopener noreferrer"&gt;github.com/plagtech&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building agents that need to move money, I'd love to hear what you're working on. Drop a comment or find me on X at &lt;a href="https://twitter.com/Spraay_app" rel="noopener noreferrer"&gt;@Spraay_app&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Follow me for more on building crypto infrastructure for AI agents. I write daily about Web3, x402, and the agent economy.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>web3</category>
      <category>ai</category>
      <category>opensource</category>
      <category>crypto</category>
    </item>
    <item>
      <title>How AI Agents Pay for APIs Without Exposing Private Keys: OWS + Spraay</title>
      <dc:creator>Mr Hamlin</dc:creator>
      <pubDate>Mon, 23 Mar 2026 18:29:27 +0000</pubDate>
      <link>https://dev.to/mr_hamlin/how-ai-agents-pay-for-apis-without-exposing-private-keys-ows-spraay-5djk</link>
      <guid>https://dev.to/mr_hamlin/how-ai-agents-pay-for-apis-without-exposing-private-keys-ows-spraay-5djk</guid>
      <description>&lt;p&gt;The agent economy just got its wallet layer.&lt;/p&gt;

&lt;p&gt;Today MoonPay launched the &lt;strong&gt;Open Wallet Standard (OWS)&lt;/strong&gt; — an open-source protocol that gives AI agents a single, encrypted vault for storing keys and signing transactions across every major blockchain. One seed phrase, one signing interface, eight chain families. Keys never leave your machine.&lt;/p&gt;

&lt;p&gt;The coalition backing it reads like a who's who: PayPal, OKX, Ripple, Solana Foundation, Ethereum Foundation, Base, Polygon, Arbitrum, Circle, Virtuals, LayerZero, and more — 21 founding organizations in total.&lt;/p&gt;

&lt;p&gt;But here's the part that caught my attention: &lt;strong&gt;OWS explicitly names x402 as the payment protocol it was built to serve.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I build &lt;a href="https://gateway.spraay.app" rel="noopener noreferrer"&gt;Spraay&lt;/a&gt; — an x402 payment gateway with 76+ paid endpoints across 13 chains. So I spent the morning digging into the OWS spec, installing the SDK, and testing how well it plugs into our stack.&lt;/p&gt;

&lt;p&gt;Short answer: it fits like a glove.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem OWS Solves
&lt;/h2&gt;

&lt;p&gt;Right now, if you're building an AI agent that pays for things — API calls, compute, data — you're probably doing something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PRIVATE_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0xabc123... &lt;span class="c"&gt;# sitting in .env&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your agent reads that key at startup, holds it in memory, and passes it to whatever signing library you're using. If you're on EVM, you're using ethers.js. Solana? Different library, different key format. Bitcoin? Yet another one.&lt;/p&gt;

&lt;p&gt;Three private keys. Three surfaces where they can leak — through logs, crash dumps, or the LLM context window itself.&lt;/p&gt;

&lt;p&gt;OWS replaces all of that with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createWallet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signTypedData&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@open-wallet-standard/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createWallet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;agent-treasury&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; addresses for EVM, Solana, BTC, Cosmos, Tron, TON, Filecoin, Sui&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signTypedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;agent-treasury&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;evm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;typedDataJson&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Private key decrypted in Rust enclave, signed, immediately wiped&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One seed. Eight chain families. Keys encrypted at rest with AES-256-GCM, decrypted only inside an isolated signing process, held in mlocked memory (pinned, never swapped to disk), and zeroized the moment the signature is produced.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your agent never sees the private key.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Spraay Comes In
&lt;/h2&gt;

&lt;p&gt;x402 is Coinbase's protocol for machine-to-machine payments. The flow works like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent requests an API endpoint&lt;/li&gt;
&lt;li&gt;Server returns &lt;code&gt;402 Payment Required&lt;/code&gt; with a payment spec&lt;/li&gt;
&lt;li&gt;Agent signs an EIP-3009 &lt;code&gt;TransferWithAuthorization&lt;/code&gt; (typed data)&lt;/li&gt;
&lt;li&gt;Agent retries with the signed payment in a header&lt;/li&gt;
&lt;li&gt;Server verifies payment, returns the data&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Steps 1, 4, and 5 are handled by the Spraay gateway. But &lt;strong&gt;step 3 — signing the payment — is where OWS comes in.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Until now, every agent doing x402 payments had to manage its own keys. OWS standardizes that layer so any agent, any framework, any tool can use the same wallet with the same security model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building It: 10 Lines to Paid API Calls
&lt;/h2&gt;

&lt;p&gt;I tested this hands-on with the OWS Node SDK (&lt;code&gt;@open-wallet-standard/core&lt;/code&gt;). Here's a complete flow — create a wallet, sign an x402 payment for a Spraay API call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createWallet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signTypedData&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@open-wallet-standard/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 1. Create wallet (one seed → addresses on every chain)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createWallet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;my-agent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;evmAddress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eip155:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Build the x402 payment (EIP-3009 TransferWithAuthorization)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;typedData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;EIP712Domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;version&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;chainId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;uint256&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;verifyingContract&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;address&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;TransferWithAuthorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;from&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;address&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;to&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;address&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;uint256&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;validAfter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;uint256&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;validBefore&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;uint256&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nonce&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bytes32&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;primaryType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TransferWithAuthorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USD Coin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;8453&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Base&lt;/span&gt;
    &lt;span class="na"&gt;verifyingContract&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;evmAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0xAd62f03C7514bb8c51f1eA70C2b75C37404695c8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Spraay&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// $0.10 USDC&lt;/span&gt;
    &lt;span class="na"&gt;validAfter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;validBefore&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0x&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRandomValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Sign it (key never leaves the Rust enclave)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signTypedData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;my-agent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;evm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;typedData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Signature:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0x&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ran this. It works. The OWS SDK produced a valid 65-byte secp256k1 signature with recovery ID, exactly what x402 expects. The signing happened in the native Rust core via NAPI-RS — no JavaScript crypto library touched the key material.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Vault Looks Like
&lt;/h2&gt;

&lt;p&gt;After &lt;code&gt;createWallet()&lt;/code&gt;, OWS stores everything at &lt;code&gt;~/.ows/&lt;/code&gt; with &lt;code&gt;700&lt;/code&gt; permissions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.ows/
  wallets/
    480d3738-4839-4cb6-bbcf-2605eb841012.json   # encrypted keystore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each wallet JSON uses the &lt;strong&gt;Ethereum Keystore v3&lt;/strong&gt; format — the same encryption that's been in production since 2015. One file, one seed, addresses for all chains.&lt;/p&gt;

&lt;h2&gt;
  
  
  The MCP Integration
&lt;/h2&gt;

&lt;p&gt;Both OWS and Spraay expose MCP servers. This means an AI agent (Claude, GPT, LangChain, etc.) can have both tools loaded simultaneously:&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;"ows"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ows"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"serve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--mcp"&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;"spraay"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@plagtech/spraay-x402-mcp"&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;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;OWS handles the wallet side (create, sign, manage keys). Spraay handles the payment side (76+ endpoints, 13 chains, token prices, batch payments, DeFi, RTP robot tasks). The agent orchestrates both without ever touching a private key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Policy Engine: Spending Limits for Agents
&lt;/h2&gt;

&lt;p&gt;One feature that's particularly useful for autonomous agents: OWS has a &lt;strong&gt;policy engine&lt;/strong&gt; that evaluates rules before any key material is decrypted.&lt;/p&gt;

&lt;p&gt;You can create API keys scoped to specific wallets, attach policies (spending limits, chain restrictions, recipient allowlists), and delegate them to sub-agents. The owner bypasses policies entirely — sudo access. Agent keys are constrained.&lt;/p&gt;

&lt;p&gt;For Spraay payments, this means you could set:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Max $1.00 USDC per API call&lt;/li&gt;
&lt;li&gt;Only Base chain allowed&lt;/li&gt;
&lt;li&gt;Only the Spraay payment address in the recipient allowlist&lt;/li&gt;
&lt;li&gt;Key expires in 24 hours&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent can make as many API calls as it wants within those bounds. Step outside them and the policy engine blocks the signing request before the key is ever decrypted.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm building a &lt;code&gt;spraay-ows&lt;/code&gt; adapter package that will handle the full x402 payment flow in a single function call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SpraayOWS&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;spraay-ows&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SpraayOWS&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;my-agent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/v1/token/price?symbol=ETH&amp;amp;chain=base&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The adapter will handle the 402 response, construct the EIP-3009 typed data, call OWS for signing, encode the payment header, and retry — all transparently.&lt;/p&gt;

&lt;p&gt;The code is already working in prototype. Will publish to npm once I've wired it into the Spraay gateway's test suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OWS&lt;/strong&gt;: &lt;a href="https://openwallet.sh" rel="noopener noreferrer"&gt;openwallet.sh&lt;/a&gt; | &lt;a href="https://github.com/open-wallet-standard/core" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;code&gt;npm install @open-wallet-standard/core&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spraay Gateway&lt;/strong&gt;: &lt;a href="https://gateway.spraay.app" rel="noopener noreferrer"&gt;gateway.spraay.app&lt;/a&gt; | &lt;a href="https://docs.spraay.app" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spraay MCP&lt;/strong&gt;: &lt;a href="https://smithery.ai/server/@plagtech/spraay-x402-mcp" rel="noopener noreferrer"&gt;Smithery&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;💧 The agent economy has payment rails. Now it has a wallet standard. And they work together.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>blockchain</category>
      <category>moonpay</category>
    </item>
    <item>
      <title>How to Add a Payment Layer to NVIDIA's Autonomous Agent Stack</title>
      <dc:creator>Mr Hamlin</dc:creator>
      <pubDate>Sun, 22 Mar 2026 23:20:29 +0000</pubDate>
      <link>https://dev.to/mr_hamlin/how-to-add-a-payment-layer-to-nvidias-autonomous-agent-stack-1g93</link>
      <guid>https://dev.to/mr_hamlin/how-to-add-a-payment-layer-to-nvidias-autonomous-agent-stack-1g93</guid>
      <description>&lt;p&gt;At GTC 2026 last week, Jensen Huang declared that "Claude Code and OpenClaw have sparked the agent inflection point — extending AI beyond generation and reasoning into action."&lt;/p&gt;

&lt;p&gt;He's right. But there's a missing piece nobody on that stage talked about: &lt;strong&gt;agents that act need to pay.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every time an autonomous agent spawns a sub-agent, accesses premium data, hires a robot, or compensates a contractor — there's a payment event. And right now, NVIDIA's agent stack (OpenShell, NemoClaw, NeMo Agent Toolkit) has no native payment rail.&lt;/p&gt;

&lt;p&gt;I spent the last week building that missing piece.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;NVIDIA shipped an incredible agentic AI stack at GTC 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenShell&lt;/strong&gt; — the open-source sandbox runtime for autonomous agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NemoClaw&lt;/strong&gt; — the OpenClaw enterprise stack with security guardrails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NeMo Agent Toolkit&lt;/strong&gt; — the library for connecting and optimizing teams of agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamo 1.0&lt;/strong&gt; — the distributed inference framework&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tools let agents reason, plan, and act inside isolated sandboxes with policy-enforced security. But when an agent needs to &lt;em&gt;spend money&lt;/em&gt; — pay for an API call, send tokens to a contractor, fund an escrow — there's nothing in the stack for that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: x402
&lt;/h2&gt;

&lt;p&gt;The x402 protocol makes payments native to HTTP. It works like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent calls a paid API endpoint&lt;/li&gt;
&lt;li&gt;Server returns &lt;strong&gt;HTTP 402 Payment Required&lt;/strong&gt; with payment details in the header&lt;/li&gt;
&lt;li&gt;Agent signs a USDC micropayment&lt;/li&gt;
&lt;li&gt;Agent resends the request with the signed payment proof&lt;/li&gt;
&lt;li&gt;Server verifies on-chain and executes the request&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No API keys for payment. No wallet UX. No Stripe integration. Just pay-per-call with USDC.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://spraay.app" rel="noopener noreferrer"&gt;Spraay&lt;/a&gt; — a gateway at &lt;code&gt;gateway.spraay.app&lt;/code&gt; that exposes 76+ endpoints across 13 blockchains using this protocol. And this week I integrated it into three layers of NVIDIA's agent stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration 1: OpenShell Sandbox
&lt;/h2&gt;

&lt;p&gt;OpenShell runs agents in isolated containers with policy-enforced egress. I built a Spraay sandbox image that any agent can launch with one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openshell sandbox create &lt;span class="nt"&gt;--from&lt;/span&gt; spraay &lt;span class="nt"&gt;--&lt;/span&gt; claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The sandbox includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;spraay&lt;/code&gt; CLI wrapper with 17 commands covering all gateway categories&lt;/li&gt;
&lt;li&gt;4 agent skills (payments, escrow, RTP robot hiring, gateway discovery)&lt;/li&gt;
&lt;li&gt;A locked-down network policy allowing only &lt;code&gt;gateway.spraay.app&lt;/code&gt; and verified RPC providers&lt;/li&gt;
&lt;li&gt;Python + Node.js crypto libraries for wallet operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key security property: &lt;strong&gt;private keys never leave the sandbox boundary.&lt;/strong&gt; All payment signing happens inside the isolated OpenShell environment.&lt;/p&gt;

&lt;p&gt;This is submitted as &lt;a href="https://github.com/NVIDIA/OpenShell-Community/pull/50" rel="noopener noreferrer"&gt;PR #50&lt;/a&gt; to NVIDIA's OpenShell Community repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration 2: NeMo Agent Toolkit
&lt;/h2&gt;

&lt;p&gt;NeMo Agent Toolkit lets you build agent workflows with a YAML config file. I created 8 custom async tools that connect to the Spraay gateway:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;functions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;spraay_balance&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;spraay_balance&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Check&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;wallet&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;balance&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;on&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;any&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;chain"&lt;/span&gt;

  &lt;span class="na"&gt;spraay_batch_send&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;spraay_batch_send&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Send&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tokens&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;multiple&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;recipients"&lt;/span&gt;

  &lt;span class="na"&gt;spraay_rtp_discover&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;spraay_rtp_discover&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Discover&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;robots&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;on&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;RTP&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;network"&lt;/span&gt;

&lt;span class="na"&gt;workflow&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;react_agent&lt;/span&gt;
  &lt;span class="na"&gt;tool_names&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;spraay_balance&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;spraay_batch_send&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;spraay_rtp_discover&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;llm_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nim_llm&lt;/span&gt;
  &lt;span class="na"&gt;verbose&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now any NeMo Agent Toolkit agent can reason about payments and execute them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nat run &lt;span class="nt"&gt;--config_file&lt;/span&gt; config.yml &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--input&lt;/span&gt; &lt;span class="s2"&gt;"Check the USDC balance for 0xAd62...95c8 on Base"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is submitted as &lt;a href="https://github.com/NVIDIA/NeMo-Agent-Toolkit-Examples/pull/20" rel="noopener noreferrer"&gt;PR #20&lt;/a&gt; to NVIDIA's NeMo Agent Toolkit Examples repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration 3: NemoClaw Network Policy
&lt;/h2&gt;

&lt;p&gt;NemoClaw sandboxes block all unauthorized outbound connections by default. For an OpenClaw agent to use Spraay, you need a network policy preset:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;egress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gateway.spraay.app&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;443&lt;/span&gt;
      &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;GET&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;POST&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/v1/**"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/health"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;note&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Spraay&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;x402&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;payment&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;gateway"&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.base.org"&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;443&lt;/span&gt;
      &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;POST&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/**"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;note&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Base&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;chain&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;RPC&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;payment&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;verification"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I submitted this as a &lt;a href="https://github.com/NVIDIA/NemoClaw/issues/625" rel="noopener noreferrer"&gt;feature request&lt;/a&gt; on the NemoClaw repo (13.9k stars) and as a &lt;a href="https://github.com/VoltAgent/awesome-nemoclaw/pull/1" rel="noopener noreferrer"&gt;preset PR&lt;/a&gt; to the awesome-nemoclaw community list.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Physical AI Angle
&lt;/h2&gt;

&lt;p&gt;Here's where it gets interesting. NVIDIA announced the Physical AI Data Factory Blueprint at GTC — an open architecture for training robotics systems. Spraay includes the &lt;strong&gt;Robot Task Protocol (RTP)&lt;/strong&gt;, an open standard for AI agents to hire robots via x402 USDC micropayments.&lt;/p&gt;

&lt;p&gt;The RTP flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent discovers available robots/devices on the network&lt;/li&gt;
&lt;li&gt;Agent reviews pricing and selects a device&lt;/li&gt;
&lt;li&gt;Agent sends x402 micropayment to commission a physical task&lt;/li&gt;
&lt;li&gt;Robot executes the task and reports results&lt;/li&gt;
&lt;li&gt;On-chain proof of completion&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This bridges NVIDIA's digital agent stack with their physical AI ambitions. When an agent running in OpenShell needs a robot to pick up a package, take a sensor reading, or run a 3D print job — RTP + Spraay is how it pays for that service.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;These integrations are all submitted and waiting for review. Whether they get merged or not, the architecture works today. You can point any agent at &lt;code&gt;gateway.spraay.app&lt;/code&gt; and start executing payments via x402.&lt;/p&gt;

&lt;p&gt;If you're building autonomous agents and need a payment rail, here are the resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gateway&lt;/strong&gt;: &lt;a href="https://gateway.spraay.app" rel="noopener noreferrer"&gt;gateway.spraay.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs&lt;/strong&gt;: &lt;a href="https://docs.spraay.app" rel="noopener noreferrer"&gt;docs.spraay.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Server&lt;/strong&gt;: &lt;a href="https://smithery.ai/server/@plagtech/spraay-x402-mcp" rel="noopener noreferrer"&gt;@plagtech/spraay-x402-mcp&lt;/a&gt; on Smithery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;x402 Protocol&lt;/strong&gt;: &lt;a href="https://www.x402.org" rel="noopener noreferrer"&gt;x402.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RTP Spec&lt;/strong&gt;: &lt;a href="https://github.com/plagtech/rtp-spec" rel="noopener noreferrer"&gt;github.com/plagtech/rtp-spec&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent inflection point is here. Now agents can pay.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://github.com/plagtech" rel="noopener noreferrer"&gt;@plagtech&lt;/a&gt;. Follow &lt;a href="https://twitter.com/Spraay_app" rel="noopener noreferrer"&gt;@Spraay_app&lt;/a&gt; for updates.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nvidia</category>
      <category>ai</category>
      <category>agents</category>
      <category>crypto</category>
    </item>
    <item>
      <title>💧 Give Your LangChain Agent a Smart Wallet on Base</title>
      <dc:creator>Mr Hamlin</dc:creator>
      <pubDate>Sun, 22 Mar 2026 04:12:44 +0000</pubDate>
      <link>https://dev.to/mr_hamlin/give-your-langchain-agent-a-smart-wallet-on-base-502c</link>
      <guid>https://dev.to/mr_hamlin/give-your-langchain-agent-a-smart-wallet-on-base-502c</guid>
      <description>&lt;p&gt;Your AI agent can write emails, search the web, and query databases. But can it deploy a smart wallet?&lt;/p&gt;

&lt;p&gt;Now it can.&lt;/p&gt;

&lt;p&gt;I just published &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/@spraay/langchain-agent-wallet" rel="noopener noreferrer"&gt;@spraay/langchain-agent-wallet&lt;/a&gt;&lt;/strong&gt; — 5 LangChain &lt;code&gt;StructuredTool&lt;/code&gt; classes that let your agent provision smart wallets, manage session keys, and predict wallet addresses on Base. Every call is paid with USDC micropayments via the &lt;a href="https://x402.org" rel="noopener noreferrer"&gt;x402 protocol&lt;/a&gt;. No API keys. No subscriptions. Just pay-per-call.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;AI agents are getting good at planning and reasoning. But when it comes to actually &lt;em&gt;holding money&lt;/em&gt; and &lt;em&gt;executing transactions&lt;/em&gt;, most frameworks punt. You end up with the agent's private key embedded in code, full access to everything, zero permission scoping.&lt;/p&gt;

&lt;p&gt;That's not how you'd let a human employee operate. Why let your agent?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: Agent Wallets with Session Keys
&lt;/h2&gt;

&lt;p&gt;Spraay's Agent Wallet infrastructure deploys a &lt;strong&gt;smart contract wallet&lt;/strong&gt; for each agent on Base. The wallet is owned by you, but the agent gets a &lt;strong&gt;session key&lt;/strong&gt; — a scoped, time-limited permission to act on behalf of the wallet.&lt;/p&gt;

&lt;p&gt;Think of it like giving an employee a corporate card with a spending limit instead of handing them the company bank login.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 5 Tools
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @spraay/langchain-agent-wallet @langchain/core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spraay_provision_wallet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deploy a new smart wallet on Base&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spraay_add_session_key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Grant scoped permissions to an address&lt;/td&gt;
&lt;td&gt;$0.02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spraay_get_wallet_info&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Query wallet details and balance&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spraay_revoke_session_key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove a session key&lt;/td&gt;
&lt;td&gt;$0.02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spraay_predict_address&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pre-compute CREATE2 wallet address&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ChatOpenAI&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@langchain/openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createToolCallingAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AgentExecutor&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;langchain/agents&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ChatPromptTemplate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@langchain/core/prompts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createSpraayWalletTools&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@spraay/langchain-agent-wallet&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Create all 5 tools with one function&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSpraayWalletTools&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;privateKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EVM_PRIVATE_KEY&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-4o&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ChatPromptTemplate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromMessages&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are a Web3 agent that manages smart wallets on Base.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;human&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;{input}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;placeholder&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;{agent_scratchpad}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createToolCallingAgent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;executor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AgentExecutor&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// The agent decides which tool to call based on natural language&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deploy a new wallet for 0x1234...abcd labeled 'treasury'&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The LLM reads the tool descriptions and zod schemas to figure out which tool to call and what parameters to pass. You don't write any routing logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  How x402 Payments Work
&lt;/h2&gt;

&lt;p&gt;Every tool call hits the Spraay gateway at &lt;code&gt;gateway.spraay.app&lt;/code&gt;. Instead of an API key, the request includes a signed payment header — your agent's private key authorizes a USDC micropayment on Base.&lt;/p&gt;

&lt;p&gt;The gateway verifies the signature, settles the payment, and executes the operation. It's like HTTP 402 (Payment Required) actually working the way it was supposed to.&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No API keys to manage or rotate&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No rate limits&lt;/strong&gt; — you pay for what you use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No subscription tiers&lt;/strong&gt; — $0.001 to $0.05 per call&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissionless&lt;/strong&gt; — any agent with USDC on Base can use it&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Deployed
&lt;/h2&gt;

&lt;p&gt;The wallet contracts are live on Base mainnet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Factory:&lt;/strong&gt; &lt;code&gt;0xFBD832Db6D9a05A0434cd497707a1bDC43389CfD&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation:&lt;/strong&gt; &lt;code&gt;0x61818Ae8bC161D1884Fd8823985B80e6733C34E7&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The gateway serves 76+ paid endpoints across 16 categories and 13 chains. Agent Wallet is Category 17.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;This is one piece of a bigger push to get Spraay tooling into every major agent framework:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ElizaOS plugin&lt;/strong&gt; — &lt;a href="https://github.com/plagtech/plugin-spraay-wallet" rel="noopener noreferrer"&gt;submitted to the registry&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CrewAI tools&lt;/strong&gt; — &lt;a href="https://github.com/plagtech/crewai-spraay-wallet" rel="noopener noreferrer"&gt;Python, no SDK dependency&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server&lt;/strong&gt; — already live on &lt;a href="https://smithery.ai" rel="noopener noreferrer"&gt;Smithery&lt;/a&gt; as &lt;code&gt;@plagtech/spraay-x402-mcp&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your agent needs to hold money, send payments, or manage wallets — and you don't want to hand it your private key — give this a try.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/@spraay/langchain-agent-wallet" rel="noopener noreferrer"&gt;@spraay/langchain-agent-wallet&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/plagtech/langchain-spraay-wallet" rel="noopener noreferrer"&gt;plagtech/langchain-spraay-wallet&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://docs.spraay.app" rel="noopener noreferrer"&gt;docs.spraay.app&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://twitter.com/lostpoet" rel="noopener noreferrer"&gt;@lostpoet&lt;/a&gt; / &lt;a href="https://twitter.com/Spraay_app" rel="noopener noreferrer"&gt;@Spraay_app&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>langchain</category>
      <category>web3</category>
      <category>ai</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>I Forked Abstract's Global Wallet to Give AI Agents Their Own Wallets on Base</title>
      <dc:creator>Mr Hamlin</dc:creator>
      <pubDate>Sat, 21 Mar 2026 03:27:05 +0000</pubDate>
      <link>https://dev.to/mr_hamlin/i-forked-abstracts-global-wallet-to-give-ai-agents-their-own-wallets-on-base-199k</link>
      <guid>https://dev.to/mr_hamlin/i-forked-abstracts-global-wallet-to-give-ai-agents-their-own-wallets-on-base-199k</guid>
      <description>&lt;h2&gt;
  
  
  The Problem: AI Agents Need Wallets, and Nobody's Making It Easy
&lt;/h2&gt;

&lt;p&gt;If you're building AI agents that interact with blockchain — trading bots, payment agents, autonomous task runners — you hit the same wall everyone hits: &lt;strong&gt;the agent needs a wallet.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your options today are pretty bad:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 1: Hardcode a private key in &lt;code&gt;.env&lt;/code&gt;.&lt;/strong&gt; This is what most tutorials show you. It's also a disaster waiting to happen. One leaked key and your agent's funds are gone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2: Use a custodial wallet provider.&lt;/strong&gt; Phantom has a Server SDK that lets you create wallets programmatically. Great concept. But you need to apply to their developer program and wait for approval. I've been waiting. And waiting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 3: Manual setup.&lt;/strong&gt; A human creates a MetaMask wallet, funds it, and pastes the key into the agent config. This works for demos. It does not work at scale when you need to spin up 100 agents.&lt;/p&gt;

&lt;p&gt;None of these give you what agents actually need: a wallet with &lt;strong&gt;spending limits&lt;/strong&gt;, &lt;strong&gt;time-bound sessions&lt;/strong&gt;, and &lt;strong&gt;automatic expiry&lt;/strong&gt;. You know, the kind of safety rails you'd want before letting an autonomous AI handle real money.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Inspiration: Abstract Global Wallet
&lt;/h2&gt;

&lt;p&gt;While building &lt;a href="https://gateway.spraay.app" rel="noopener noreferrer"&gt;Spraay&lt;/a&gt; (a multi-chain batch payment protocol), I started exploring Abstract chain as a potential addition to our supported networks. Abstract is an L2 built by the Pudgy Penguins team, and their standout feature is the &lt;strong&gt;Abstract Global Wallet (AGW)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;AGW is elegant. You sign up with an email, and a smart contract wallet gets deployed for you behind the scenes. No seed phrases. No browser extensions. The wallet travels with you across every app on Abstract. Under the hood, it uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;factory contract&lt;/strong&gt; that deploys wallet instances via CREATE2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native account abstraction&lt;/strong&gt; for gasless transactions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session keys&lt;/strong&gt; for pre-authorized actions without repeated signing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privy&lt;/strong&gt; for key management (splitting the private key into three shards)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture is adapted from &lt;a href="https://github.com/getclave/clave-contracts" rel="noopener noreferrer"&gt;Clave's zkSync contracts&lt;/a&gt;, and it's open source under GPL-3.0.&lt;/p&gt;

&lt;p&gt;I looked at this and thought: &lt;strong&gt;this is exactly what AI agents need. But the SDK only works in browsers, and the chain is locked to Abstract.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fork: What I Kept and What I Changed
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/Abstract-Foundation/agw-contracts" rel="noopener noreferrer"&gt;AGW contracts repo&lt;/a&gt; gave me the blueprint. Here's what I adapted:&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Kept
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Factory pattern with CREATE2&lt;/strong&gt; — deterministic wallet addresses, minimal proxy clones (EIP-1167). Each wallet deployment costs roughly $0.01-0.05 in gas on Base.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart contract wallet architecture&lt;/strong&gt; — the wallet is a contract, not an EOA. This enables programmable rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session keys&lt;/strong&gt; — the feature that makes this work for agents. A session key is a temporary signer with a spending limit, expiry time, and optional target restrictions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What I Changed
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Removed Privy key-sharding&lt;/strong&gt; — AGW splits the private key into three shards (device, server, recovery cloud). Agents don't have devices or iCloud. In our version, agents either hold their own keys (self-custody) or the provisioning service generates and encrypts keys server-side (managed mode).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployed on Base instead of Abstract&lt;/strong&gt; — Abstract's SDK is chain-locked due to their native account abstraction implementation. Our contracts are standard Solidity that works on any EVM chain. We deployed on Base because that's where the rest of the Spraay ecosystem lives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Added agent metadata&lt;/strong&gt; — Each wallet stores an &lt;code&gt;agentId&lt;/code&gt; and &lt;code&gt;agentType&lt;/code&gt; (e.g., "eliza", "langchain", "crewai"). This feeds into our trust scoring system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exposed via x402 gateway&lt;/strong&gt; — Instead of a browser SDK, wallet provisioning happens through API endpoints on our payment gateway. An agent pays $0.05 USDC and gets a wallet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI Agent (ElizaOS / LangChain / CrewAI / etc.)
    │
    │  x402 USDC micropayment ($0.05)
    ▼
Spraay Gateway (gateway.spraay.app)
    │
    │  POST /v1/wallet/provision
    ▼
SpraayWalletFactory (Base)
    │
    │  CREATE2 deploy (EIP-1167 minimal proxy)
    ▼
SpraayAgentWallet
    ├── Session Keys (spending limits + time bounds)
    ├── Batch Execution (multi-call in one tx)
    └── Agent Metadata (identity + trust scoring)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The factory deploys minimal proxy clones — just 45 bytes of runtime bytecode that delegate all calls to the implementation contract. This keeps deployment gas costs extremely low.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Contracts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SpraayAgentWallet.sol
&lt;/h3&gt;

&lt;p&gt;The core wallet supports three main capabilities:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Session Keys&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function addSessionKey(
    address sessionKey,
    uint256 spendLimitWei,
    uint256 validUntil,
    address[] calldata allowedTargets
) external onlyOwner;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An agent creates a session key with a spending cap, expiry, and optional contract whitelist. The session key can then sign transactions on behalf of the wallet within those bounds. If the key is compromised, damage is capped at the spending limit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Batch Execution&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function executeBatch(
    address[] calldata targets,
    uint256[] calldata values,
    bytes[] calldata datas
) external onlyOwnerOrValidSession;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agents often need to do multiple things in one action — approve a token, then swap it, then send the result somewhere. Batch execution handles this atomically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Agent Metadata&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function setAgentMetadata(
    string calldata agentId,
    string calldata agentType
) external onlyOwner;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every wallet knows what agent framework created it and carries a unique identifier. This connects to our ProofLayer trust scoring system — agents build reputation over time based on their on-chain behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  SpraayWalletFactory.sol
&lt;/h3&gt;

&lt;p&gt;The factory takes an implementation address in its constructor and deploys clones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;constructor(address _implementation) {
    require(_implementation != address(0), "SWF: zero impl");
    admin = msg.sender;
    walletImplementation = _implementation;
}

function createWallet(
    address owner,
    string calldata agentId,
    string calldata agentType,
    bytes32 salt
) external whenNotPaused returns (address wallet) {
    bytes32 finalSalt = keccak256(abi.encodePacked(owner, salt));
    wallet = _deployClone(walletImplementation, finalSalt);
    SpraayAgentWallet(payable(wallet)).initialize(owner, agentId, agentType);
    _wallets.push(wallet);
    _isWallet[wallet] = true;
    emit WalletCreated(wallet, owner, agentId, agentType);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deterministic addresses via CREATE2 mean you can predict a wallet's address before deploying it — useful for pre-funding scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment
&lt;/h2&gt;

&lt;p&gt;The contracts are live on Base Sepolia testnet:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Contract&lt;/th&gt;
&lt;th&gt;Address&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Implementation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0xb6843955D914aD61dc6A4C819E0734d96467a391&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Factory&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0xe483F189af41FB5479cd8695DbbA16cc5CF1071D&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Demo Wallet&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0xcC74104d9d55889606e51FeD0f57c3AE23FC8054&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The deployment process had its share of nonce collisions and "replacement transaction underpriced" errors from rapid-fire attempts on the testnet RPC. Pro tip: when deploying multiple contracts in sequence, explicitly manage your nonces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nonce&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTransactionCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;deployer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;impl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Impl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nonce&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;factory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;implAddr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nonce&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The SDK (Coming Soon)
&lt;/h2&gt;

&lt;p&gt;Agent frameworks will be able to provision wallets with a few lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SpraayWallet&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;spraay-agent-wallet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;SpraayWallet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;provision&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-trading-agent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;agentType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;langchain&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;managed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;x402PaymentHeader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;X402_HEADER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Add a session key: 0.5 ETH limit, 24 hours&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addSessionKey&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;spendLimitEth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;durationHours&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;allowedTargets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0x...BatchContract&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is one &lt;code&gt;npm install&lt;/code&gt; and three lines of code. If it's harder than that, developers won't use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;The intersection of AI agents and crypto is heating up fast. Coinbase has x402 for agent-to-agent payments. Virtuals Protocol has an agent economy. Every major framework is adding tool-use capabilities that include blockchain interactions.&lt;/p&gt;

&lt;p&gt;But the wallet layer has been ignored. Everyone assumes the agent already has a wallet. Nobody's asking: &lt;strong&gt;how does the agent get the wallet in the first place? And how do you put guardrails on it so it doesn't drain its funds on a bad decision?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Session keys are the answer. An agent with a session key that caps spending at 0.5 ETH per day, expires in 24 hours, and can only interact with three specific contracts is a fundamentally different risk profile than an agent holding an unrestricted private key.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Base mainnet deployment&lt;/strong&gt; — same contracts, real money&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gateway integration&lt;/strong&gt; — wallet endpoints join the existing 76+ paid endpoints on Spraay's x402 gateway&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent framework PRs&lt;/strong&gt; — ElizaOS plugin, LangChain tool, CrewAI integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ProofLayer scoring&lt;/strong&gt; — wallet behavior feeds into agent trust scores&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm publish&lt;/strong&gt; — &lt;code&gt;spraay-agent-wallet&lt;/code&gt; package for drop-in SDK usage&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;The code is open source: &lt;a href="https://github.com/plagtech/spraay-agent-wallet" rel="noopener noreferrer"&gt;github.com/plagtech/spraay-agent-wallet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contracts are GPL-3.0, same license as the AGW contracts we forked from. If you're building agents that need wallets, take a look. If you have ideas for how session key policies should work for different agent types, open an issue.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://twitter.com/lostpoet" rel="noopener noreferrer"&gt;@lostpoet&lt;/a&gt; — building &lt;a href="https://gateway.spraay.app" rel="noopener noreferrer"&gt;Spraay&lt;/a&gt; 💧, a multi-chain batch payment protocol with 76+ x402 gateway endpoints across 13 chains.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks to the &lt;a href="https://github.com/Abstract-Foundation" rel="noopener noreferrer"&gt;Abstract Foundation&lt;/a&gt; and &lt;a href="https://github.com/getclave" rel="noopener noreferrer"&gt;Clave&lt;/a&gt; for the open source smart contract wallet architecture that made this possible.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wallet</category>
      <category>ai</category>
      <category>agents</category>
      <category>web3</category>
    </item>
    <item>
      <title>Stripe Just Validated Agent Payments — Here's Why the Open Web Still Needs x402</title>
      <dc:creator>Mr Hamlin</dc:creator>
      <pubDate>Thu, 19 Mar 2026 17:18:34 +0000</pubDate>
      <link>https://dev.to/mr_hamlin/stripe-just-validated-agent-payments-heres-why-the-open-web-still-needs-x402-44ed</link>
      <guid>https://dev.to/mr_hamlin/stripe-just-validated-agent-payments-heres-why-the-open-web-still-needs-x402-44ed</guid>
      <description>&lt;h2&gt;
  
  
  Stripe Just Said the Quiet Part Out Loud
&lt;/h2&gt;

&lt;p&gt;Yesterday, Stripe and Paradigm launched &lt;a href="https://tempo.xyz" rel="noopener noreferrer"&gt;Tempo&lt;/a&gt; — a payments-focused Layer 1 blockchain — alongside the &lt;strong&gt;Machine Payments Protocol (MPP)&lt;/strong&gt;, an open standard for AI agent-to-service payments.&lt;/p&gt;

&lt;p&gt;The partner list reads like a who's who of global finance: Visa, Mastercard, OpenAI, Anthropic, DoorDash, Shopify, Revolut, Ramp, Nubank, and Standard Chartered.&lt;/p&gt;

&lt;p&gt;Let that sink in. &lt;strong&gt;The world's largest payment processor just built a blockchain specifically so AI agents can pay for things.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you've been building in the agent payments space, this is the validation moment. The thesis is no longer speculative. Stripe, with $1.9 trillion in annual payment volume, is betting its infrastructure future on the idea that &lt;strong&gt;machines will be the next wave of paying customers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But here's where it gets interesting — and where builders need to pay attention to what's actually being built.&lt;/p&gt;

&lt;h2&gt;
  
  
  How MPP Works
&lt;/h2&gt;

&lt;p&gt;The Machine Payments Protocol follows a straightforward flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An AI agent requests a resource from a service&lt;/li&gt;
&lt;li&gt;The service responds with a payment request&lt;/li&gt;
&lt;li&gt;The agent authorizes payment from its wallet&lt;/li&gt;
&lt;li&gt;The transaction settles instantly on Tempo&lt;/li&gt;
&lt;li&gt;The service delivers the resource&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;MPP also introduces &lt;strong&gt;sessions&lt;/strong&gt; — described by Tempo as "OAuth for money." An agent authorizes once, then payments execute programmatically within defined limits. Think of it like an API key, but for spending.&lt;/p&gt;

&lt;p&gt;Visa has extended MPP for card-based payments. Stripe extended it for cards and wallets. Lightspark extended it for Bitcoin payments over Lightning. The protocol is designed to be rail-agnostic.&lt;/p&gt;

&lt;p&gt;This is genuinely impressive engineering. And it's going to accelerate the entire category.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But there's a catch.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  MPP Runs on Tempo. Tempo Runs on Permission.
&lt;/h2&gt;

&lt;p&gt;Tempo is a proprietary Layer 1 blockchain incubated by Stripe and Paradigm. It raised $500 million at a $5 billion valuation. Its engineering team includes former Optimism CEO Liam Horne and Paradigm CTO Georgios Konstantopoulos.&lt;/p&gt;

&lt;p&gt;The partners building on it — Visa, Mastercard, Standard Chartered — are institutions that require compliance registries, KYC frameworks, and regulatory oversight baked into the chain itself.&lt;/p&gt;

&lt;p&gt;That's not a criticism. It's a design choice. Tempo is built for enterprise-grade, regulated payment workloads. It has ISO 20022 compliance for banking integration. It has smart accounts with built-in governance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But it's not the open web.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're an independent developer building an AI agent that needs to pay for an API call, you don't want to onboard to Tempo's partner ecosystem first. If you're a small team running a paid endpoint in Lagos or Bangalore, you don't want to wait for Stripe's compliance team to approve your service.&lt;/p&gt;

&lt;p&gt;The open web runs on HTTP. And agent payments on the open web need something native to HTTP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter x402: The Permissionless Alternative
&lt;/h2&gt;

&lt;p&gt;The x402 protocol takes a fundamentally different approach. Instead of building a new blockchain for payments, it embeds payments into the protocol the web already runs on — &lt;strong&gt;HTTP&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's how x402 works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An AI agent sends an HTTP request to a paid endpoint&lt;/li&gt;
&lt;li&gt;The server responds with &lt;strong&gt;HTTP 402 Payment Required&lt;/strong&gt; + payment details&lt;/li&gt;
&lt;li&gt;The agent sends a USDC micropayment on-chain&lt;/li&gt;
&lt;li&gt;The server verifies payment and returns the resource&lt;/li&gt;
&lt;li&gt;All of this happens in a single HTTP request-response cycle&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No new chain. No partner ecosystem. No compliance registry. Just HTTP + USDC + any EVM chain.&lt;/p&gt;

&lt;p&gt;The 402 status code has been reserved in the HTTP specification since 1997 — literally waiting for digital payments to catch up. Coinbase formalized the x402 protocol to finally put it to use, and builders like us at &lt;a href="https://spraay.app" rel="noopener noreferrer"&gt;Spraay&lt;/a&gt; have been running it in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Comparison
&lt;/h2&gt;

&lt;p&gt;Let's be honest about what each approach optimizes for:&lt;/p&gt;

&lt;h3&gt;
  
  
  MPP (Stripe/Tempo)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Optimized for:&lt;/strong&gt; Enterprise, institutional, regulated workloads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settlement:&lt;/strong&gt; Tempo L1 (proprietary)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partners:&lt;/strong&gt; Visa, Mastercard, OpenAI, Anthropic, Shopify&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KYC/Compliance:&lt;/strong&gt; Built into the chain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access model:&lt;/strong&gt; Partner ecosystem onboarding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Large platforms integrating agent payments into existing Stripe infrastructure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; Sub-$0.001 fees on Tempo&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  x402 (Coinbase/Open Standard)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Optimized for:&lt;/strong&gt; Permissionless, open web, developer-first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settlement:&lt;/strong&gt; Any EVM chain (Base, Ethereum, Arbitrum, Solana, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partners:&lt;/strong&gt; Anyone with an HTTP endpoint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KYC/Compliance:&lt;/strong&gt; Not required at the protocol level&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access model:&lt;/strong&gt; Permissionless — deploy and earn&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Independent developers, API builders, open-source projects, global south builders&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; Configurable per endpoint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't competing standards. They're &lt;strong&gt;complementary layers&lt;/strong&gt; for different parts of the economy.&lt;/p&gt;

&lt;p&gt;MPP will handle the Shopify checkout, the DoorDash delivery payment, the enterprise SaaS billing. x402 will handle the indie API, the open-source tool, the agent-to-agent micropayment, the robot task commission — the long tail of the agent economy that institutional gatekeepers can't (and won't) serve.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Spraay Is Doing With x402
&lt;/h2&gt;

&lt;p&gt;We've been building the x402 gateway at &lt;a href="https://gateway.spraay.app" rel="noopener noreferrer"&gt;gateway.spraay.app&lt;/a&gt; since early 2025. Today it has &lt;strong&gt;76+ paid endpoints across 16 categories&lt;/strong&gt; on 13 chains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Inference&lt;/strong&gt; — LLM access via OpenRouter and BlockRun (93 models)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RPC Access&lt;/strong&gt; — Blockchain data via Alchemy across 7 chains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication&lt;/strong&gt; — Email via AgentMail, messaging via XMTP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt; — IPFS pinning via Pinata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search/RAG&lt;/strong&gt; — Web intelligence via Tavily&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robot Tasks&lt;/strong&gt; — Physical robot commissioning via RTP (Robot Task Protocol)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bitcoin&lt;/strong&gt; — Non-custodial PSBT batch payments via Mempool.space&lt;/li&gt;
&lt;li&gt;And 9 more categories covering oracles, compliance, compute, wallets, and more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every endpoint accepts USDC micropayments via x402. Any agent — OpenClaw, NemoClaw, LangChain, CrewAI, or a custom script — can call these endpoints without onboarding, without KYC, without a Stripe account.&lt;/p&gt;

&lt;p&gt;That's the point. &lt;strong&gt;The open web shouldn't require a permission slip to participate in the agent economy.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Week Matters
&lt;/h2&gt;

&lt;p&gt;In the span of 48 hours:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stripe/Paradigm&lt;/strong&gt; launched Tempo + MPP for institutional agent payments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mastercard&lt;/strong&gt; acquired stablecoin infrastructure firm BVNK for $1.8 billion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PayPal&lt;/strong&gt; expanded cross-border stablecoin payments to 70 countries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEC/CFTC&lt;/strong&gt; classified 16 crypto assets as commodities (not securities)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NVIDIA&lt;/strong&gt; projected $1 trillion in AI infrastructure spend through 2027&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of these events validates the same thesis: &lt;strong&gt;AI agents are becoming economic actors, and they need payment rails.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The institutional side is covered. Stripe, Mastercard, Visa, and PayPal are building for their customers.&lt;/p&gt;

&lt;p&gt;But who's building for the rest of the web?&lt;/p&gt;

&lt;p&gt;That's us. That's x402. That's every independent builder who ships a paid API endpoint and wants an AI agent to be able to pay for it — without asking anyone's permission.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;If you want to explore agent payments via x402:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use the Spraay gateway:&lt;/strong&gt; &lt;a href="https://gateway.spraay.app" rel="noopener noreferrer"&gt;gateway.spraay.app&lt;/a&gt; — 76+ endpoints ready for agent consumption&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the x402 spec:&lt;/strong&gt; &lt;a href="https://github.com/coinbase/x402" rel="noopener noreferrer"&gt;Coinbase x402 repo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build your own x402 endpoint:&lt;/strong&gt; The facilitator pattern lets you add x402 payments to any Express.js server in ~20 lines of code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try the MCP server:&lt;/strong&gt; &lt;code&gt;@plagtech/spraay-x402-mcp&lt;/code&gt; on Smithery — 66 tools for AI agent integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent economy isn't coming. It launched this week. The question is whether it'll be open or closed.&lt;/p&gt;

&lt;p&gt;We're betting on open.&lt;/p&gt;




&lt;p&gt;💧 &lt;strong&gt;Spraay&lt;/strong&gt; is a multi-chain batch payment protocol and x402 gateway. &lt;a href="https://spraay.app" rel="noopener noreferrer"&gt;spraay.app&lt;/a&gt; | &lt;a href="https://gateway.spraay.app" rel="noopener noreferrer"&gt;gateway.spraay.app&lt;/a&gt; | &lt;a href="https://github.com/plagtech" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What's your take — will MPP and x402 coexist, or will one standard win? Let me know in the comments.&lt;/em&gt;&lt;/p&gt;

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