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
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.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
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.
| Before the split | After the split | |
|---|---|---|
| Raw balance (balanceOf) | 10 | 10 (unchanged) |
| uiMultiplier | 1.0 | 4.0 |
| Shares represented | 10 x 1.0 = 10 | 10 x 4.0 = 40 |
| Share price | $800 | $200 |
| Position value | 10 shares x $800 = $8,000 | 40 shares x $200 = $8,000 |
- 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.
Robinhood's API, Vectr's API and the contract
| Value | Robinhood Stock Token API | Vectr API | On-chain |
|---|---|---|---|
| Current multiplier | GET /rhj/assets → currentMultiplier | GET /stocks → multiplier | uiMultiplier() / 1e18 |
| Scheduled change | pendingMultiplier, pendingMultiplierEffectiveTime | — | newUIMultiplier(), effectiveAt() |
| Share price (not adjusted) | GET /rhj/prices/SYMBOL → bid, ask | GET /stocks/SYMBOL → quote.bid, quote.ask | — |
| Token value (adjusted) | share price x currentMultiplier | GET /stocks/SYMBOL → priceUsd | — |
| Corporate actions | GET /rhj/corporate-actions (cached 1 hour) | — | UIMultiplierUpdated event |
| Price feed paused | — | — | oraclePaused() on the token |
| Token price, oracle | — | — | Chainlink feed: already share price x multiplier |
- 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
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.
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.
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.
- CRWD
- Name
- CrowdStrike Holdings
- Multiplier
- 4.0
- SOXX
- Name
- iShares Semiconductor ETF
- Multiplier
- 3.001353
- CCL
- Name
- Carnival Corporation
- Multiplier
- 1.025056
- PFE
- Name
- Pfizer
- Multiplier
- 1.010111
- SGOV
- Name
- iShares 0-3 Month Treasury Bond
- Multiplier
- 1.009470
- F
- Name
- Ford Motor
- Multiplier
- 1.008520
- SCHD
- Name
- Schwab US Dividend Equity ETF
- Multiplier
- 1.005539
- LHX
- Name
- L3Harris
- Multiplier
- 1.004922
- ORCL
- Name
- Oracle
- Multiplier
- 1.004763
- IBM
- Name
- IBM
- Multiplier
- 1.004739
- KSS
- Name
- Kohls Corporation
- Multiplier
- 1.004610
- PR
- Name
- Permian Resources
- Multiplier
- 1.004478
- UNH
- Name
- UnitedHealth
- Multiplier
- 1.004242
- SHY
- Name
- iShares 1-3 Year Treasury Bond ETF
- Multiplier
- 1.004203
- INTU
- Name
- Intuit
- Multiplier
- 1.003227
- TSM
- Name
- Taiwan Semiconductor Manufacturing
- Multiplier
- 1.002729
- CSCO
- Name
- Cisco Systems
- Multiplier
- 1.002675
- UPS
- Name
- UPS
- Multiplier
- 1.002209
- SIMO
- Name
- Silicon Motion
- Multiplier
- 1.002144
- SPMO
- Name
- Invesco S&P 500 Momentum ETF
- Multiplier
- 1.002025
- VTI
- Name
- Vanguard Morningstar Total Stock Market ETF
- Multiplier
- 1.001751
- SPY
- Name
- SPDR S&P 500 ETF Trust
- Multiplier
- 1.001718
- HPE
- Name
- HP Enterprise
- Multiplier
- 1.001717
- COST
- Name
- Costco
- Multiplier
- 1.001622
- V
- Name
- Visa
- Multiplier
- 1.001280
- AVGO
- Name
- Broadcom
- Multiplier
- 1.001257
- QCOM
- Name
- Qualcomm
- Multiplier
- 1.001228
- CRM
- Name
- Salesforce
- Multiplier
- 1.001148
- VST
- Name
- Vistra
- Multiplier
- 1.001115
- GE
- Name
- General Electric
- Multiplier
- 1.001049
- XOM
- Name
- ExxonMobil Holdings Corporation
- Multiplier
- 1.001040
- DELL
- Name
- Dell
- Multiplier
- 1.001020
- MPWR
- Name
- Monolithic Power Systems
- Multiplier
- 1.001003
- ASML
- Name
- ASML Holding NV
- Multiplier
- 1.000878
- AMKR
- Name
- Amkor Technology
- Multiplier
- 1.000867
- XLK
- Name
- State Street Technology Select Sector SPDR ETF
- Multiplier
- 1.000804
- NVDA
- Name
- NVIDIA
- Multiplier
- 1.000775
- LRCX
- Name
- Lam Research Corp
- Multiplier
- 1.000733
- QQQ
- Name
- Invesco QQQ
- Multiplier
- 1.000701
- TER
- Name
- Teradyne
- Multiplier
- 1.000648
- AAPL
- Name
- Apple
- Multiplier
- 1.000566
- META
- Name
- Meta Platforms
- Multiplier
- 1.000541
- HWM
- Name
- Howmet Aerospace
- Multiplier
- 1.000474
- MSFT
- Name
- Microsoft
- Multiplier
- 1.000413
- WDC
- Name
- Western Digital
- Multiplier
- 1.000218
- GOOGL
- Name
- Alphabet Class A
- Multiplier
- 1.000194
- MU
- Name
- Micron Technology
- Multiplier
- 1.000183
- VRT
- Name
- Vertiv
- Multiplier
- 1.000163
- MRVL
- Name
- Marvell Technology
- Multiplier
- 1.000151
- SKHY
- Name
- SK hynix Inc. American Depositary Shares
- Multiplier
- 1.000060
- AMAT
- Name
- Applied Materials
- Multiplier
- 1.000045
- JNJ
- Name
- Johnson & Johnson
- Multiplier
- 1.000021
- LMT
- Name
- Lockheed
- Multiplier
- 1.000021
- LLY
- Name
- Eli Lilly
- Multiplier
- 1.000002
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.
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
- Every Stock Token, with its addressSymbol, contract, price and multiplier for all Stock Tokens on Robinhood ChainOpen table
- Launch a memestockPair a token with any of the Stock Tokens on Robinhood ChainLaunch
- Robinhood Chain for developersRPC, chain ID, explorer, WETH, Uniswap V3 and the stock registryRead
- Integrate VectrEvents, curve ABI and the endpoints that already apply the multiplierRead docs
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.