<?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: Rodrigo Puliceno</title>
    <description>The latest articles on DEV Community by Rodrigo Puliceno (@rpulicen).</description>
    <link>https://dev.to/rpulicen</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4068416%2F6e83d5e0-24b6-47d0-abcd-6db3146c75c5.jpg</url>
      <title>DEV Community: Rodrigo Puliceno</title>
      <link>https://dev.to/rpulicen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rpulicen"/>
    <language>en</language>
    <item>
      <title>x402 designs out the intermediaries that produce your tax records</title>
      <dc:creator>Rodrigo Puliceno</dc:creator>
      <pubDate>Sat, 08 Aug 2026 06:54:46 +0000</pubDate>
      <link>https://dev.to/rpulicen/x402-designs-out-the-intermediaries-that-produce-your-tax-records-j28</link>
      <guid>https://dev.to/rpulicen/x402-designs-out-the-intermediaries-that-produce-your-tax-records-j28</guid>
      <description>&lt;p&gt;x402 lets software pay for things over HTTP. An agent calls a paid API, a&lt;br&gt;
fraction of a cent in USDC settles on-chain, the agent gets its data. No&lt;br&gt;
accounts, no API keys, no invoice. In December 2025 the protocol handled roughly&lt;br&gt;
63 million transactions across 64,000 unique buyers, averaging about twelve cents&lt;br&gt;
each.&lt;/p&gt;

&lt;p&gt;I spent an evening reading the v2 specification line by line. The thing that&lt;br&gt;
struck me isn't in the spec at all. It's what the spec leaves out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every one of those payments is a disposition
&lt;/h2&gt;

&lt;p&gt;In the United States, stablecoins are treated as property rather than currency.&lt;br&gt;
Spending one is a disposition that realizes gain or loss against basis. That is&lt;br&gt;
true of a $50,000 transfer and it is true of a payment worth twelve cents.&lt;/p&gt;

&lt;p&gt;The obvious rebuttal is the $10,000 stablecoin de minimis threshold introduced&lt;br&gt;
alongside Form 1099-DA. It does not apply here, twice over.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It relieves brokers, not taxpayers.&lt;/strong&gt; The threshold exempts a broker from&lt;br&gt;
filing a form. It changes nothing about the taxpayer's obligation to report gain,&lt;br&gt;
loss and ordinary income. Practitioner guidance on this is consistent and blunt:&lt;br&gt;
the de minimis rules reduce broker burdens, not tax liability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And x402 payments are not broker transactions.&lt;/strong&gt; The optional aggregate method&lt;br&gt;
covers "designated sales" — a qualifying stablecoin sold for fiat, or exchanged&lt;br&gt;
for another qualifying stablecoin. Paying an API for data is neither. And a&lt;br&gt;
payment made from a self-custodied wallet has no broker in the loop to file&lt;br&gt;
anything in the first place.&lt;/p&gt;

&lt;p&gt;So no form is ever issued, and the obligation stands.&lt;/p&gt;

&lt;h2&gt;
  
  
  The structural problem
&lt;/h2&gt;

&lt;p&gt;Ordinary crypto accounting is messy. This is worse, and for an interesting&lt;br&gt;
reason: x402's entire design goal is removing intermediaries.&lt;/p&gt;

&lt;p&gt;Banks, card networks and payment processors are precisely the parties whose&lt;br&gt;
statements normally &lt;em&gt;are&lt;/em&gt; your evidence. When a dispute arises about what you&lt;br&gt;
paid, when, and to whom, you produce a statement. Strip those parties out — which&lt;br&gt;
is the protocol working exactly as intended — and the only objective record left&lt;br&gt;
is a transaction hash. Compliance falls back to self-declaration.&lt;/p&gt;

&lt;p&gt;Tax practitioners flagged this as the protocol launched. It is not a&lt;br&gt;
hypothetical, and it is not a criticism of x402. It is a straightforward&lt;br&gt;
consequence of disintermediation that the payment layer was never trying to&lt;br&gt;
solve.&lt;/p&gt;

&lt;p&gt;The expensive failure mode isn't the tax owed. On a pegged asset that's close to&lt;br&gt;
zero — that is what a peg is for. It's a proceeds figure with no basis behind it,&lt;br&gt;
which reads as a fully taxable gain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two things the payload doesn't carry
&lt;/h2&gt;

&lt;p&gt;Reading the v2 spec closely surfaced two gaps that only bite at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There is no settlement timestamp.&lt;/strong&gt; &lt;code&gt;SettleResponse&lt;/code&gt; carries &lt;code&gt;success&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;transaction&lt;/code&gt;, &lt;code&gt;network&lt;/code&gt;, and optionally &lt;code&gt;payer&lt;/code&gt; and &lt;code&gt;amount&lt;/code&gt;. No time. The only&lt;br&gt;
clock anywhere in the flow is the EIP-3009 &lt;code&gt;validAfter&lt;/code&gt;/&lt;code&gt;validBefore&lt;/code&gt; window,&lt;br&gt;
which brackets when the &lt;em&gt;authorization&lt;/em&gt; was valid — not when settlement occurred.&lt;/p&gt;

&lt;p&gt;Settlement date determines holding period and tax year. So anyone booking these&lt;br&gt;
into a ledger has to source that date from outside the protocol: carry an&lt;br&gt;
out-of-band observation timestamp, resolve the block timestamp from the&lt;br&gt;
transaction hash, or infer from &lt;code&gt;validAfter&lt;/code&gt; and accept a window of error. The&lt;br&gt;
third is what a naive implementation does, and it's wrong in a way that's hard to&lt;br&gt;
notice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And &lt;code&gt;PaymentRequirements&lt;/code&gt; carries no decimals.&lt;/strong&gt; It gives you an asset address&lt;br&gt;
and an amount in atomic units. A payload alone cannot tell you whether &lt;code&gt;"10000"&lt;/code&gt;&lt;br&gt;
means one cent or ten thousand dollars.&lt;/p&gt;

&lt;p&gt;In practice everyone assumes six, because in 2026 it's nearly always USDC. That&lt;br&gt;
assumption is already load-bearing upstream — the reference paywall generates a&lt;br&gt;
decimals map containing only chains whose default asset &lt;em&gt;isn't&lt;/em&gt; six decimals, and&lt;br&gt;
assumes six for everything else. There are already exceptions in the wild; Hedera&lt;br&gt;
prices HBAR in tinybars at eight.&lt;/p&gt;

&lt;p&gt;Neither gap matters when a human reviews each payment. Both matter enormously&lt;br&gt;
when forty thousand accumulate unattended.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/rpulicen/agentledger" rel="noopener noreferrer"&gt;agentledger&lt;/a&gt; normalizes x402, ACP and&lt;br&gt;
MPP payment records into one schema and matches dispositions against tax lots&lt;br&gt;
using FIFO, LIFO or HIFO. Zero runtime dependencies, MIT.&lt;/p&gt;

&lt;p&gt;Two design rules drove most of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No floats, anywhere.&lt;/strong&gt; Every monetary value is a bigint scaled by 10^18. One&lt;br&gt;
float rounding error in a ledger with 100,000 micropayments is unrecoverable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Never guess a number.&lt;/strong&gt; An unresolvable asset produces &lt;code&gt;decimals: null&lt;/code&gt;, a&lt;br&gt;
warning, and a skipped disposal — not a plausible-looking wrong figure. Missing&lt;br&gt;
basis is flagged rather than assumed to be zero, because assuming zero silently&lt;br&gt;
maximizes reported gain.&lt;/p&gt;

&lt;p&gt;The x402 adapter is field-mapped against the published v2 specification. The ACP&lt;br&gt;
and MPP adapters are provisional and say so in every record they emit, because a&lt;br&gt;
parser that silently guesses field names produces a ledger that looks&lt;br&gt;
authoritative and is wrong — which is worse than no ledger.&lt;/p&gt;

&lt;h2&gt;
  
  
  I'd rather be corrected than admired
&lt;/h2&gt;

&lt;p&gt;I'm a builder, not a tax practitioner. The reading above is careful but the&lt;br&gt;
regulations are new and still moving. If you work in digital asset tax and&lt;br&gt;
something here is wrong, the issues are open and I'd genuinely like to know.&lt;/p&gt;

&lt;p&gt;I've also filed a proposal upstream suggesting an optional &lt;code&gt;settledAt&lt;/code&gt; field in&lt;br&gt;
&lt;code&gt;SettleResponse&lt;/code&gt;, since the timestamp gap seems like something worth fixing at&lt;br&gt;
the protocol level rather than working around in every implementation&lt;br&gt;
separately.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Nothing here is tax advice. Verify current law with a professional in your&lt;br&gt;
jurisdiction.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>x402</category>
      <category>ai</category>
      <category>cryptocurrency</category>
      <category>tax</category>
    </item>
  </channel>
</rss>
