Stock Tokens

Stock Token multipliers: splits and dividends without a rebase

Robinhood's Stock Tokens on Robinhood Chain keep balances in shares and put splits and dividends into an on-chain multiplier. If you price a Stock Token from the share price alone, you are wrong by that multiplier. This page explains the mechanism, shows the live numbers, and says what a launchpad has to do about it.

Updated

Mechanism

One multiplier, no rebase

A Robinhood Stock Token is a standard ERC-20 with 18 decimals. Its balanceOf is the raw token amount, and corporate actions never mint or burn it. Instead the contract implements ERC-8056, the scaled UI amount extension: uiMultiplier() returns the shares one raw unit stands for, scaled by 1e18, and Robinhood raises it when a dividend is reinvested or a stock splits. The registry publishes the same value as currentMultiplier.

The contract also exposes balanceOfUI() and totalSupplyUI() for share-equivalent amounts, and a scheduled change through newUIMultiplier() and effectiveAt(). So the balance a wallet or a bonding curve holds never changes; what changes is what one unit is worth. Robinhood documents all of it in its building with Stock Tokens guide, the primary source for this page.

shares represented  = raw balance * uiMultiplier() / 1e18
token value (USD)  = share price (USD) * currentMultiplier

// e.g. a 4:1 split: balances stay the same, multiplier 1.0 -> 4.0,
// each token unit is now worth four post-split shares.
// e.g. a dividend: multiplier 1.000000 -> 1.000775, no token moved.
Live

Two tokens, read from the registry now

Share price from Robinhood's quote, multiplier from the registry, token value from the product. Re-read every five minutes.

Token
CRWD (CrowdStrike Holdings)
currentMultiplier
4.0
Share price (Robinhood mid)
$224.09
Token value
$896.36share price x multiplier
Token
NVDA (NVIDIA)
currentMultiplier
1.000775
Share price (Robinhood mid)
$175.38
Token value
$175.52share price x multiplier
Corporate action

A 4-for-1 split, worked through

Illustrative numbers. Robinhood lists each action at GET https://api.robinhood.com/rhj/corporate-actions; the types active today are FORWARD_SPLIT, REVERSE_SPLIT, CASH_DIVIDEND and STOCK_DIVIDEND.

  • Raw balance (balanceOf)
    Before the split
    10
    After the split
    10 (unchanged)
  • uiMultiplier
    Before the split
    1.0
    After the split
    4.0
  • Shares represented
    Before the split
    10 x 1.0 = 10
    After the split
    10 x 4.0 = 40
  • Share price
    Before the split
    $800
    After the split
    $200
  • Position value
    Before the split
    10 shares x $800 = $8,000
    After the split
    40 shares x $200 = $8,000

Nothing moved on-chain except one number. A reader that multiplies the new $200 share price by the raw balance of 10 would show $2,000 and be wrong by a factor of four: that is the bug the pricing rule below exists to prevent. A cash dividend works the same way at a smaller scale: it is reinvested through a small rise in the multiplier, so a Stock Token tracks the total return of its underlying.

Field names

Robinhood's API, Vectr's API and the contract

  • Current multiplier
    Robinhood Stock Token API
    GET /rhj/assets → currentMultiplier
    Vectr API
    GET /stocks → multiplier
    On-chain
    uiMultiplier() / 1e18
  • Scheduled change
    Robinhood Stock Token API
    pendingMultiplier, pendingMultiplierEffectiveTime
    Vectr API
    —
    On-chain
    newUIMultiplier(), effectiveAt()
  • Share price (not adjusted)
    Robinhood Stock Token API
    GET /rhj/prices/SYMBOL → bid, ask
    Vectr API
    GET /stocks/SYMBOL → quote.bid, quote.ask
    On-chain
    —
  • Token value (adjusted)
    Robinhood Stock Token API
    share price x currentMultiplier
    Vectr API
    GET /stocks/SYMBOL → priceUsd
    On-chain
    —
  • Corporate actions
    Robinhood Stock Token API
    GET /rhj/corporate-actions (cached 1 hour)
    Vectr API
    —
    On-chain
    UIMultiplierUpdated event
  • Price feed paused
    Robinhood Stock Token API
    —
    Vectr API
    —
    On-chain
    oraclePaused() on the token
  • Token price, oracle
    Robinhood Stock Token API
    —
    Vectr API
    —
    On-chain
    Chainlink feed: already share price x multiplier
In code

Read the multiplier and price a token in TypeScript

import { createPublicClient, http, parseAbi, formatUnits } from "viem";

const client = createPublicClient({ transport: http("https://rpc.mainnet.chain.robinhood.com") });
const abi = parseAbi([
  "function uiMultiplier() view returns (uint256)",
  "function balanceOf(address) view returns (uint256)",
]);

const token = "0x…";   // the Stock Token contract, from /docs/stock-tokens/addresses
const holder = "0x…";

const [multiplier, raw] = await Promise.all([
  client.readContract({ address: token, abi, functionName: "uiMultiplier" }),
  client.readContract({ address: token, abi, functionName: "balanceOf", args: [holder] }),
]);

const shares = (raw * multiplier) / 10n ** 18n;   // share-equivalent, 18 decimals

// Robinhood's price is per share and NOT multiplier-adjusted.
const { bid, ask } = await fetch("https://api.robinhood.com/rhj/prices/NVDA").then((r) => r.json());
const shareUsd = (Number(bid) + Number(ask)) / 2;
const tokenUsd = shareUsd * Number(formatUnits(multiplier, 18));   // one raw token unit
const positionUsd = Number(formatUnits(raw, 18)) * tokenUsd;

Or skip the arithmetic: Vectr's GET /stocks/SYMBOL returns priceUsd already multiplied, next to Robinhood's raw quote.

Oracles and hours

Price feeds, market hours and stale quotes

From Robinhood's oracles, Stock Token API and Stock Token pages, read 30 September 2026.

Chainlink feed price
Share price x multiplierThe on-chain feed is already multiplier-adjusted: do not multiply again
Feed updates
24/5, on market hoursMost USD feeds use 8 decimals; addresses at docs.chain.link
During a corporate action
oraclePaused() = trueAdvisory, not enforced on-chain; the feed holds its last good value
/rhj/prices cache
15 secondsRaw underlying bid and ask, not multiplier-adjusted
/rhj/corporate-actions cache
1 hour
API rate limit
60 requests per secondAll Stock Token endpoints
Minting and redemption
Mon 02:00 to Sat 02:00 CET/CESTOn-chain trading continues outside this window
Trading halt
isTradingHalt on /rhj/pricesThe token keeps trading on-chain; USD figures may be stale
// Price a Stock Token from its Chainlink feed, with the two guards Robinhood asks for.
const feedAbi = parseAbi([
  "function latestRoundData() view returns (uint80, int256 answer, uint256, uint256 updatedAt, uint80)",
  "function decimals() view returns (uint8)",
]);
const tokenAbi = parseAbi(["function oraclePaused() view returns (bool)"]);

const feed = "0x…";    // the token's USD feed, from docs.chain.link (network: robinhood)
const [[, answer, , updatedAt], decimals, paused] = await Promise.all([
  client.readContract({ address: feed, abi: feedAbi, functionName: "latestRoundData" }),
  client.readContract({ address: feed, abi: feedAbi, functionName: "decimals" }),
  client.readContract({ address: token, abi: tokenAbi, functionName: "oraclePaused" }),
]);

const tokenUsd = Number(answer) / 10 ** decimals;          // already x multiplier
const ageSec = Date.now() / 1000 - Number(updatedAt);
const usable = !paused && ageSec < MAX_AGE_SEC;            // your staleness bound, per market hours
// Also check the L2 sequencer uptime feed before trusting any price.

A staleness bound is the primary guard: oraclePaused() is a flag the contract exposes during a corporate action, not something the chain enforces, and outside market hours the feed legitimately stops moving. A price your UI shows over a weekend is Friday's close times the current multiplier; say so next to it.

Which tokens

54 of 204 tokens carry a multiplier today

Anything whose underlying paid a dividend or split since Robinhood issued the token. The table is the registry as of this render.

For builders

How a launchpad must price a stock-paired market

A memestock on Vectr is a bonding curve quoted in a Stock Token: the price is "NVDA per token", reserves are NVDA, creator fees accrue in NVDA. All of that is in token units and none of it cares about the multiplier. The multiplier only enters when you show a dollar figure: market cap, 24h volume, creator earnings, a per-transaction USD cap.

The mistake is easy to make. Robinhood's own quote endpoint returns the share price, unadjusted. Any fallback source (Yahoo, a mock) returns the share price too. Vectr shipped that bug: the primary path applied the multiplier, the fallback did not, so a market paired with a 4.0-multiplier token would have shown a quarter of its real value the moment the primary endpoint was down, and a $500 spending cap would have passed a $2,000 trade. The fix is one rule: every price source that quotes a share passes through the multiplier.

Rule: tokenUsd = shareUsd * multiplierOf(symbol) on every path, including fallbacks. Vectr exposes the adjusted number at GET /stocks/SYMBOL so integrators do not repeat the mistake.
FAQ

Questions people ask

Do Robinhood Stock Tokens rebase after a split?

No. balanceOf and totalSupply stay unscaled. A split or dividend changes the multiplier (the verified implementation exposes updateMultiplier for Robinhood's operator; the documented interface is uiMultiplier, newUIMultiplier and effectiveAt), and the token's value per unit changes with it. Transfer events carry the unscaled amount and TransferWithScaledUI carries both.

Is the Chainlink price for a Stock Token already multiplier-adjusted?

Yes. Robinhood's docs say the feed returns the price of one token, the underlying share price times the multiplier, so you do not apply the multiplier yourself. Robinhood's /rhj/prices endpoint is the opposite: the raw underlying bid and ask. During a corporate action the token's oraclePaused() returns true and the feed holds its last good value.

How do I get the USD price of a Stock Token?

Take the share price from Robinhood's quote endpoint (api.robinhood.com/rhj/prices/SYMBOL), which is not multiplier-adjusted, and multiply by currentMultiplier from the registry (api.robinhood.com/rhj/assets). Vectr's GET /stocks/SYMBOL returns the adjusted number directly.

Which Stock Tokens have a multiplier other than 1?

Right now 54 of 204 tokens in the registry: CRWD (4.0), SOXX (3.001353), CCL (1.025056), PFE (1.010111), SGOV (1.009470), F (1.008520), SCHD (1.005539), LHX (1.004922), ORCL (1.004763), IBM (1.004739), KSS (1.004610), PR (1.004478) and others. The list changes on every ex-dividend date.

Can Americans buy Stock Tokens?

Robinhood states the tokens are not offered to US persons and are restricted in Canada, the United Kingdom and Switzerland. Vectr does not issue the tokens and does not change that.

Does a multiplier change affect a Vectr bonding curve?

No. The curve holds token units and prices in token units, and creator fees accrue in token units. Only the USD display layer applies the multiplier, so a split changes what a market is worth in dollars, not how many tokens anyone holds.

Keep going

Sources: the token implementation and beacon on robin.etherscan.io, Robinhood's registry and quote endpoints, and Vectr's stocks API. Numbers on this page are read at render time and are not investment advice.