Launch App

ERC-8056 Stock Standard

Robinhood Chain stock tokens implement the ERC-8056 standard to represent fractional stock shares on L2. This standard handles corporate actions like splits, merges, and dividends transparently on-chain.

Why it exists

In traditional finance, corporate actions (e.g. stock splits, stock dividends, mergers) frequently change the meaning of a "share" or require adjustments to historical pricing. A static ERC20 token cannot adapt to a 3-for-1 split without forcing every holder to swap their tokens or recalculate balances.

ERC-8056 solves this by introducing a dynamic uiMultiplier() that is managed by the token issuer's oracle. The token balance stored in the ledger remains static, while user interfaces scale the displayed balance using the multiplier.

The Interface

IERC8056.sol
interface IERC8056 is IERC20 {
    // Returns the current cumulative multiplier for splits and dividends
    // 1.0 = 10^18 (1e18)
    function uiMultiplier() external view returns (uint256);

    // Returns true if the token's trading is halted for corporate events
    function oraclePaused() external view returns (bool);

    // Emitted when splits or stock dividends update the multiplier
    event UIMultiplierUpdated(uint256 newMultiplier);

    // Emitted when trading halts or resumes
    event OraclePauseStateChanged(bool paused);
}

The Multiplier Rule

Multiplier calculation applies ONLY to balances.The Chainlink oracle price feeds for stocks on Robinhood Chain are already total-return adjusted (i.e., the price feed answers already account for splits and dividends). You must apply the multiplier on the **balance side**, never on the price side. Applying it to both will double-count the corporate actions!

How to calculate holdings

To display correct shares and portfolio values in your dApp, follow this math:

holdings-value.ts
// 1 — Get the raw ERC20 balance
const rawBalance = await token.balanceOf(userAddress); // e.g. 5.0 * 1e18

// 2 — Get the current stock split / dividend multiplier
const multiplier = await token.uiMultiplier(); // e.g. 2.0 * 1e18 (after a 2-for-1 split)

// 3 — Calculate the actual share-equivalent balance
const shareEquivalent = (rawBalance * multiplier) / 10n ** 18n; // 10.0 * 1e18

// 4 — Fetch the total return USD price from the Chainlink feed (8 decimals)
const priceUsd = Number(latestAnswer) / 1e8; // e.g. $150.00

// 5 — Compute the actual portfolio holdings value
const totalValueUsd = (Number(shareEquivalent) / 1e18) * priceUsd; // $1,500.00

Oracle Pauses

During major corporate announcements, trading halts on traditional exchanges (NASDAQ/NYSE), or after-hours adjustments, the token issuer may call oraclePaused() = true. While paused:

  • ERC20 transfer and transferFrom function calls continue to work normally.
  • The LongbowExecutor smart contract will refuse to execute any limit or DCA orders involving the paused token to protect users from stale-oracle pricing.