Docs Robinhood Chain
Robinhood Chain
Chain 4663, an Arbitrum Orbit rollup where Robinhood issues tokenized stocks and Uniswap v4 holds their liquidity.
Registry · chain 4663
sample values
Apple
AAPL
- multiplier
- 1.000566
- raw
- 1.000000
- shares
- 1.000566
address from registryNVIDIA
NVDA
- multiplier
- 1.000000
- raw
- 1.000000
- shares
- 1.000000
address from registryCrowdStrike
CRWD
- multiplier
- 4.000000
- raw
- 1.000000
- shares
- 4.000000
address from registry
shares = raw × multiplier / 1e18 // holdings.ts rawToShares
Network
Robinhood Chain is an Arbitrum Orbit (Nitro) rollup that settles to Ethereum. Gas is paid in ETH. Everything Photoswap does onchain happens here, and lib/chain.ts is the one place the facts live.
- Chain id
- 4663
- RPC
- https://rpc.mainnet.chain.robinhood.com
- Explorer
- https://robinhoodchain.blockscout.com
- Stack
- Arbitrum Orbit, Nitro
- Gas
- ETH
- Stablecoin
- USDG (Global Dollar), 6 decimals
The registry
Robinhood publishes its tokenized stock list and prices on two keyless endpoints. lib/robinhood.ts reads both, filters to ASSET_STATUS_ACTIVE assets with a deployment on chain 4663, and joins them into TokenQuote objects. Assets are cached one hour, prices twenty seconds, and a stale cache is served rather than an error.
| Endpoint | Fields read | Cache |
|---|---|---|
| https://api.robinhood.com/rhj/assets | tokenSymbol tokenName status currentMultiplier logoUrl tokenDecimals deployments[] | 1h |
| https://api.robinhood.com/rhj/prices | quotes[].tokenSymbol bid ask isTradingHalt | 20s |
About 194 stocks and ETFs are live: AAPL, TSM, SKHY (SK Hynix), AVGO, QCOM, MU, NVDA, AMD, ASML, TSLA, AMZN, MSFT, GOOGL, META, COST, F, XOM and the rest. The registry name is cleaned of its Robinhood Token suffix before display.
Shares and the multiplier
Every stock is an 18-decimal ERC-20 that also implements ERC-8056, which adds a uiMultiplier. balanceOf returns raw units. The number of shares you actually hold is the raw balance times the multiplier, and the multiplier changes on corporate actions: a 4-for-1 split sets it to 4e18, which is exactly where CRWD sits today.
// shares = raw × uiMultiplier / 1e18 / 1e18
export function rawToShares(raw: bigint, multiplier: string | undefined | null): number {
const m = parseMultiplier(multiplier);
return (Number(raw) / 1e18) * (Number(m) / 1e18);
}Do not skip this
formatUnits(balance, 18) looks right for it and silently wrong for AAPL. Every balance and every expected output in Photoswap goes through rawToShares.Impersonators
The explorer lists contracts named after real stocks that are not Robinhood's. Photoswap never resolves a stock by name from the explorer. Addresses come from the registry's deployments[].contractAddress for chain 4663 only, and the periphery addresses below are pinned in code.
RPC quirks
The public RPC answers JSON-RPC batches out of order. viem's default transport batches requests, which then mis-assigns results. publicClient is created with batch: false, and anything that needs many reads goes through Multicall3 instead, which is one call from the RPC's point of view.
export const publicClient = createPublicClient({
chain: robinhoodChain,
transport: http(ROBINHOOD_RPC, { timeout: 8_000, retryCount: 2, batch: false }),
});Contracts
Uniswap v4 is where the stocks have liquidity; the v3 stock pools are empty. Pools use no hooks, and native ETH is currency 0x0, which sorts first. The fee tiers Photoswap probes, in order, are 5%, 1%, 0.3%, 0.05%, 0.01%. The 5% tier is the one stock pools use.
| Name | Address |
|---|---|
| Multicall3 | 0xcA11bde05977b3631167028862bE2a173976CA11 |
| USDG | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 |
| WETH | 0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73 |
| Permit2 | 0x000000000022D473030F116dDEE9F6B43aC78BA3 |
| v4 PoolManager | 0x8366a39cc670b4001a1121b8f6a443a643e40951 |
| v4 Quoter | 0x8dc178efb8111bb0973dd9d722ebeff267c98f94 |
| UniversalRouter | 0x8876789976decbfcbbbe364623c63652db8c0904 |
| v4 StateView | 0xf3334192d15450cdd385c8b70e03f9a6bd9e673b |
| v3 QuoterV2 | 0x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7 |
| v3 SwapRouter02 | 0xcaf681a66d020601342297493863e78c959e5cb2 |
