Ticks: WTF!?

Conversations exploring the latest Uniswap V4 protocols, hooks and industry news.

Stocks Just Showed Up on Uniswap V4. Here's the Builder's Side.

By Twade

Tokenized SpaceX, Apple, Tesla, NVIDIA and more are live on Uniswap. The pools sit on V4 with hooks doing the compliance work, the Trading API routes through them with zero special-case code, and the Community SDK forwards hookData unchanged. A short read on what changed for builders.


Uniswap shipped tokenized securities to the web app, the wallet, and the API on June 12. Eligible users can now trade tokenized versions of SpaceX, Apple, Tesla, NVIDIA and a growing list of other real-world assets directly on Uniswap surfaces. Uniswap's headline numbers so far: $9.1B swapped in real-world asset pools across 2.6M transactions and 140k wallets.

The market-side story is for finance outlets. For builders: the pools sit on Uniswap V4, the V4 hook layer does the compliance work, and the developer integration is "nothing changes." If you're building a trading interface, a wallet, a routing aggregator, or an agentic bot against the Uniswap API, you can route through stock pools the same way you'd route through ETH-USDC today.


The pools live on V4

Tokenized stocks on Uniswap are real V4 pools, not synthetic price-feeds wrapped in a frontend. The liquidity is on-chain, the PoolManager is the same as every other asset's, and the pools route and index like any other token.

The hook layer is why V4 is the right home for tokenized securities. From the Uniswap post: "v4 hooks support issuer-configured transfer restrictions, allowlists, geographic gates, and dynamic fee structures at the pool level." Those map onto specific permissions covered in Every Hook in V4:

  • beforeSwap for KYC checks, allowlist verification, and geographic gates. The hook can revert before the AMM runs if the swapper doesn't meet eligibility criteria.
  • beforeAddLiquidity and beforeRemoveLiquidity for restricting LP participation to whitelisted addresses, which matters when the issuer needs to know who is providing liquidity against their asset.
  • beforeSwap combined with beforeSwapReturnDelta for dynamic fee structures that respond to market conditions, issuer policy, or per-counterparty rules.

These hooks look the same as any other compliance-driven V4 pool you'd write. There's nothing tokenized-securities-specific in the protocol surface; it's the regular V4 hook system encoding what regulated asset markets need.

Insight

Uniswap didn't build a securities module. Issuers are using the same hook permissions you'd reach for on any other gated pool, which means the compliance layer is something you can read, audit, and build against with tools you already have.


The API: same flow, zero special-case code

The Trading API piece I covered in an earlier post is the same API powering the new stock routes. The Uniswap blog frames it the same way: "Developers using the Uniswap API don't need to do anything differently for their users to access tokenized securities."

The three-call flow you'd use for any token works for stocks without modification:

// Quote a swap into a tokenized stock. Identical shape to any other token.
const quote = await fetch('/api/uniswap/quote', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-universal-router-version': '2.0',
    // x-api-key injected server-side
  },
  body: JSON.stringify({
    swapper: walletAddress,
    tokenIn: USDC,
    tokenOut: TOKENIZED_TSLA,   // routable via the API like any ERC-20
    tokenInChainId: '1',
    tokenOutChainId: '1',
    amount: '100000000',         // 100 USDC, raw units
    type: 'EXACT_INPUT',
    routingPreference: 'BEST_PRICE',
    protocols: ['V2', 'V3', 'V4'],
  }),
}).then(r => r.json());

The compliance layer is invisible to the API. Eligibility, allowlist, and geography checks all happen on-chain inside the hook attached to the pool, so the API call shape stays the same. If the swapper doesn't meet the issuer's criteria, the swap reverts at the hook layer when it executes; the API doesn't gate the quote.

Three things that follow from that:

  • Quote in good faith and handle revert gracefully. Your app may successfully quote a stock swap that then reverts on broadcast because the user isn't on the allowlist for that pool. Surface the revert reason cleanly so the user can take whatever action the issuer requires (often: complete KYC, or accept that the asset isn't available in their jurisdiction).
  • The CORS gotcha still applies. Same proxy pattern as the Trading API piece, with the API key injected server-side. Nothing changes here.
  • UniswapX routing for stocks is unconfirmed. The announcement's framing points at CLASSIC AMM routes, but Uniswap hasn't said either way. If the API returns a UniswapX route for a tokenized security, treat it like any other UniswapX order and use the standard /order flow.

The SDK: hookData carries the load

The Community Uniswap SDK from Zaha Studio handles tokenized stock pools through the same hookData parameter it uses for any other hooked V4 pool. Each route hop accepts a hookData bytes field that the SDK forwards unchanged into the quote and swap-path encoding:

import { sortTokens, UniswapSDK } from "@zahastudio/uniswap-sdk";
 
const sdk = UniswapSDK.create(client, mainnet.id);
 
const [currency0, currency1] = sortTokens(USDC, TOKENIZED_AAPL);
 
const quote = await sdk.getQuote({
  route: [
    {
      poolKey: {
        currency0,
        currency1,
        fee: 3000,
        tickSpacing: 60,
        hooks: STOCK_POOL_HOOK_ADDRESS,   // issuer's compliance hook
      },
      hookData: "0x",   // or issuer-specified bytes if the hook needs context
    },
  ],
  exactInput: { currency: USDC, amount: 100_000000n },
});

What goes in hookData is hook-specific. An allowlist hook that checks msg.sender against an on-chain registry needs nothing from you, so hookData stays empty ("0x"). Hooks that need additional context (a referral code, a transfer-restriction acknowledgment, a session ID) would document the expected encoding. Read the hook's own docs or IHookInfo-style on-chain metadata before assuming "0x".

The useSwap hook in the SDK's React package wraps all of this. Same workflow as any other token: quote, approve / Permit2 if needed, execute. The compliance check runs on-chain as part of the swap.


The caveats

This is a finance product in a way most things on Uniswap aren't. Four specifics from Uniswap's disclaimer that bite at the integration layer:

  • Tokenized doesn't always mean ownership. Many tokenized securities reference an underlying asset without conferring direct ownership of it. Your users should know what they're holding.
  • Securities Act registration varies. Some of the listed assets haven't been registered under the Securities Act of 1933 and can't be offered to U.S. persons absent an exemption. If your app has U.S. users, talk to a lawyer about this before you ship.
  • Eligibility is per-asset and may be enforced at the hook layer. A user being able to use your app doesn't mean they can transact every asset listed. Build for graceful rejection at the swap step.
  • None of this is investment advice. I'm a hook developer, not a financial advisor. If you're building a product that lets users buy tokenized SpaceX, your duty-of-care obligations aren't something to figure out in production.

Why this matters for agentic builders

The agentic builder use cases the Foundation has been flagging (DCA bots, treasury rebalancers, FX-style stable bots, scheduled trading agents) just got a much bigger surface area. A treasury rebalancer that previously had to choose between ETH, BTC, and stables can now hold a basket that includes tokenized T-bills, dividend-paying equity exposures, and yield-bearing assets, all through the same Trading API call shape.

If you've been sitting on an agentic trading idea waiting for "more interesting assets to route through," more interesting assets are now there.


Companion reading

If you ship something on top of the new stock routes, or hit a hook-revert pattern worth talking about, find me on X or in the Atrium Academy Discord. Office hours run there.

  • Twade