Multipliers
The uiMultiplier series indexed by block — the primitive every correct historical answer depends on.
How it works
Robinhood stock tokens express corporate actions by adjusting a shares-per-token multiplier rather than by minting or burning. A holder's balanceOf() is unchanged across a 4-for-1 split; uiMultiplier() quadruples instead.
This is deliberate and it is the reason generic EVM tooling produces wrong answers here. The underlying-share equivalent of a holding is balanceOf() multiplied by uiMultiplier(), and the multiplier is a function of time.
Because dividends are reinvested through the multiplier rather than paid out, a stock token tracks the total return of its underlying, not its price return.
Onchain interface
function balanceOf(address) returns (uint256); // raw, staticfunction uiMultiplier() returns (uint256); // 18 decimals, 1e18 == 1.0function balanceOfUI(address) returns (uint256); // underlying-share equivalentfunction newUIMultiplier() returns (uint256); // pending valuefunction effectiveAt() returns (uint256); // when it applies event UIMultiplierUpdated( uint256 oldMultiplier, uint256 newMultiplier, uint256 effectiveAt);Querying a past multiplier
We store every UIMultiplierUpdated event indexed by block, reconciled against Robinhood's /assets endpoint. The series is immutable and append-only: a historical multiplier is never rewritten, and a correction is a new record superseding an old one with both retained.
# The multiplier in force at a specific blockcurl -s "https://api.robinhoodrpc.io/v1/instruments/NVDA/multiplier?as_of_block=4200000" \ -H "Authorization: Bearer $RHRPC_KEY" # The full seriescurl -s https://api.robinhoodrpc.io/v1/instruments/NVDA/multiplier/history \ -H "Authorization: Bearer $RHRPC_KEY"Correctness
Chainlink price feeds are already multiplier-adjusted. Applying uiMultiplier() to a Chainlink price squares the multiplier and produces a number wrong by that factor. Robinhood's REST /prices endpoint is the opposite: raw underlying, needing the multiplier applied. Getting these two backwards is the mirror-image bug.