Changelog

Release notes for txdecode, newest first. Each entry is also published in the RSS feed.

1.3.4

Fixed

  • A compressed-NFT (cNFT) trade on Tensor now reads "Bought/Sold an NFT" instead of a contradictory "0 NFTs" next to the price.
  • A Solana transfer paid for by a third party (sponsored / gasless) now names the real token sender, not the wallet that only paid the network fee.
  • A wrap/unwrap that passes through a router no longer shows a misleading USD value on a balance that nets to nearly zero.
  • A Solana swap paid in SOL now reports the true input amount, with the network fee excluded from token_in (it is still counted once, in the fee).
  • A Solana native-SOL or wSOL borrow/withdraw now reports the full amount disbursed, with the network fee shown separately rather than subtracted from the amount.

This is a correctness-only release: it fixes cases where the interpreted output (the action label, an amount, a USD value, or the plain-language summary) did not match what the transaction actually did. These corrections sit in how movements are summarized and assembled, above the per-protocol recognizers. The payment, the route shape (GET /api/v1/decode/{chain}/{txHash}), and the JSON response shape are all unchanged. Cached decodes of affected transactions are recomputed with the corrected output.

1.3.2

Fixed

  • Solana swaps now report the paid token as token_in and the received token as token_out (matching every other chain), and the swap's USD value is taken from the token you paid. The plain-language summary now reads in the correct direction.
  • Compound III base-asset borrows and repayments are now labeled lending-borrow / lending-repay instead of lending-withdraw / lending-supply, when the position shows it was a full borrow or repay.
  • A transfer you received now reads "Received … from <sender>" instead of "Sent … to <yourself>". Outbound transfers are unchanged.
  • A swap whose wallet nets more than one paid or received token now reports the dominant (largest) leg as token_in / token_out and as the USD basis, instead of whichever appeared last in the logs.
  • A token mint or burn to another party in the same transaction no longer changes the verb of your own transfer (e.g. no more "Minted" on a plain transfer).
  • Curve and Balancer swaps that pay out native ETH now include that ETH in net_flows, so the headline and the net flows agree.

This is a correctness-only release: it fixes cases where the interpreted output (the action label, the swap direction, the USD value basis, or the plain-language summary) did not match what the transaction actually did. The payment, the route shape (GET /api/v1/decode/{chain}/{txHash}), and the JSON response shape are all unchanged. Cached decodes of affected transactions are recomputed with the corrected output.

1.3.3

Fixed

  • A multi-hop Curve swap now reports the final output token as token_out, instead of the intermediate token of the first hop.
  • Wrapping ETH no longer double-counts the ETH outflow or shows the WETH contract as a counterparty in net_flows.
  • A bridge fill submitted by a relayer or third party is no longer labeled as your own bridge receive; the direction follows the real recipient.
  • On a sped-up bridge fill, the receive now reports the amount that was actually delivered.
  • Wrapping and unwrapping the native token shows the correct per-chain symbol (WPOL on Polygon, WBNB on BSC) instead of WETH everywhere.
  • A Solana transfer you received is no longer rendered as "Sent … to yourself"; it reads as a received transfer from the sender.
  • NFT mint/burn verbs and the NFT-vs-token details are now taken from your own leg of the transaction, not the first matching log.
  • A transfer between two third parties in the same transaction is no longer attributed to you.
  • Concentrated-liquidity (Uniswap V3-style) positions net additions against removals correctly, with no add/remove double-count.
  • A single ambiguous 4-byte function selector is no longer asserted as the definitive function name when it could collide with another function.
  • Solana native-SOL lending amounts exclude the network fee from the supplied principal.

This is a correctness-only release: it fixes cases where the interpreted output (the action label, the swap or bridge direction, the token or amount, or the plain-language summary) did not match what the transaction actually did. The payment, the route shape (GET /api/v1/decode/{chain}/{txHash}), and the JSON response shape are all unchanged. Cached decodes of affected transactions are recomputed with the corrected output.

1.3.1

Changed

  • The public OpenAPI document (/api/openapi.json) descriptions were cleaned of internal document references so the spec is self-contained for API consumers and agents.

Removed

  • Removed the legacy base-alias GET /api/v1/decode/{txHash}. Decode Base transactions via the canonical GET /api/v1/decode/base/{txHash} (every chain uses /api/v1/decode/{chain}/{txHash}). Payment and the response are unchanged.

This release drops the historical chainless decode alias so there is now one canonical route shape for every chain: GET /api/v1/decode/{chain}/{txHash}. Decode Base transactions via /api/v1/decode/base/{txHash}. Payment is unchanged: still per call in USDC over x402 on Base, with no account and no API key, and the response body is identical.

1.3.0

Added

  • EVM lending: Spark and Aave v2 (Ethereum), plus Compound v3 (Comet), Compound v2 (cTokens) and Morpho Blue, with supply, withdraw, borrow and repay decoded as the real underlying asset, never the receipt/share token.
  • Solana lending: Kamino Lend, MarginFi v2 and Solend, recognized by program and instruction, with the underlying token as the basis; a deposit is no longer mislabelled a swap.
  • Solana NFT trades: Tensor (tensorswap and TCOMP) and Magic Eden (v2 and MMM) buys and sales, with the SOL price as the basis. Compressed-NFT (TCOMP) trades are recognized with the price even when the token id is not yet resolved.
  • Bridge: Across v3 deposits and fills (multi-token: USDC, WETH and others, resolved from the log), and the BSC Stargate v2 USDC pool. New destination mappings: CCTP domains Aptos and Ink, and LayerZero endpoints for BNB Chain and Avalanche.

Changed

  • OpenAPI 3.1 contract widened (additive, minor): the open ProtocolTag enum gains the new lending and bridge venue tags, and the NFT-trade and bridge detail objects gain their new venue protocol values. No closed enum changed; no /api/v2.

Fixed

  • NFT listing-fill valuations no longer report a null total: an NFT movement leg is now correctly treated as not-priced rather than a failed price, so the priced payment leg drives the total.

A coverage release: txdecode now recognizes many more lending markets, NFT marketplaces and bridges across the EVM chains and Solana, each attributed only when the on-chain emitter (or Solana program and instruction) is verified, so an unknown venue still degrades honestly rather than guessing. Payment is unchanged: still per call in USDC over x402 on Base, with no account and no API key.

1.2.0

Added

  • New EVM DEX recognizers: Balancer v2 (swaps plus add/remove liquidity), CoW Protocol, Curve, 1inch, 0x / Matcha, and the v2/v3 forks PancakeSwap, SushiSwap, Camelot, QuickSwap and Velodrome, each attributed only when verified on-chain.
  • Lending family: Aave v3 supply, withdraw, borrow and repay are decoded with the real underlying asset and a borrow rate, no longer surfaced as raw debt-token mints.
  • NFT-trade family: Seaport order fulfillment is decoded as a buy or sale with the NFT, price, and counterparty.
  • Bridge family: Circle CCTP v1/v2 and Stargate v2 transfers are decoded with source and destination chains.
  • Origin labels for transactions routed through known trading bots (Maestro, Banana Gun).

Changed

  • OpenAPI 3.1 contract widened (additive, minor): the action family enum now includes lending, nft-trade and bridge, and the response schema gains lending, NFT and bridge detail objects. No /api/v2.
  • The /.well-known/x402 manifest now advertises the facilitator as self-hosted, and the site advertises multichain decode.

Fixed

  • Honest, router-aware swap labels: a swap is attributed to the venue we actually recognize instead of always reading "Uniswap Universal Router", and the stale hardcoded label is gone from the hero demo, docs and /llms-full.txt example.
  • Eliminated a class of mislabels at settlement and vault boundaries: CoW and Balancer transactions are no longer reported as an incidental Uniswap swap, a WETH unwrap, or an LP burn.
  • Curve, 1inch and 0x swaps now resolve both legs, so the headline and USD valuation come out instead of a bare token transfer.
  • Solana swaps are inferred more reliably from the signer's net balance change, fixing Phoenix and Raydium boundary cases and stopping Marinade unstakes from being labelled a swap on an unknown DEX.

The accumulated quality release. txdecode recognizes dozens more DEXs and protocols, attributes a swap only to the venue it can actually verify, and understands three new kinds of action: lending, NFT trades, and bridges, each with structured details. A class of settlement and vault-boundary mislabels is gone, and aggregator swaps now resolve both legs so the headline and USD value come out. Payment is unchanged: still per call in USDC over x402 on Base, with no account and no API key.

1.1.0

Added

  • Solana decode via GET /api/v1/decode/solana/{txHash}: SOL balances are read from the transaction's pre/post balance diff and SPL token movements are normalized like any other asset, with SOL as the native currency in balances and prose.
  • Solana DEX recognizers, with multi-DEX attribution for aggregated routes so a single swap routed across venues is reported honestly.

Changed

  • OpenAPI 3.1 contract widened additively for the solana network: tx.network and tx.chain_id now span Solana too. Widening this closed enum is a minor, additive change. No /api/v2.

Solana is now the seventh chain txdecode reads, alongside Base and the five other EVM chains. SOL and SPL movements are decoded from the same endpoint with the same normalized shape, and aggregated swaps are attributed across the DEXs they actually touch. Payment is unchanged: still per call in USDC over x402 on Base, with no account and no API key.

1.0.0

Added

  • GET /api/v1/decode/{txHash}: decode any Base mainnet transaction into a human-readable action and normalized asset movements, priced at $0.005 in USDC via x402.
  • Logs-only decode engine covering ERC-20/721/1155 transfers, WETH, Uniswap v2/v3/v4 and Aerodrome swaps, approvals, and x402/EIP-3009 settlements.
  • Per-movement and gas USD valuation with null-severe pricing semantics and a normative, half-even USD rounding rule.
  • EVM multichain decode via GET /api/v1/decode/{chain}/{txHash}: the same engine now reads Ethereum, Optimism, Arbitrum, Polygon and BNB Chain, with per-chain native-asset awareness so balances and prose use ETH, POL and BNB where appropriate.
  • Interactive playground that runs the full x402 pay-per-call flow on Base Sepolia.
  • Machine-readable surface: OpenAPI 3.1, /llms.txt, /llms-full.txt and a /.well-known/x402 manifest.

First public release. txdecode turns any transaction hash into a human-readable action plus normalized asset movements, paid per call in USDC over x402, with no account and no API key. With this release the decoder contract is frozen: from here on, anything you can observe change in a response is a versioned release, not a silent edit. The five extra EVM chains landed during the 1.0.0 line, so a Polygon transaction reads in POL and a BNB Chain transaction in BNB, while payment stays on Base.