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

ERC-8056 Scaled UI Amount Extensionsolidity
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

Correctness note

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.

Related