Start here · Robinhood Chain
The event layer for tokenized stocks
Robinhood Chain ships Chainlink price feeds for its stock tokens. It does not ship the facts around those prices: Chainlink's docs state it “does not provide corporate-action calendar data or automated pause triggers”, and Robinhood's docs call the token's oraclePaused() flag “advisory and not enforced on-chain”. Novak resolves those facts once and every protocol reads the same answer.
Novak and Chainlink
| Chainlink on Robinhood Chain | Novak | |
|---|---|---|
| Answers | What is NVDA’s price now? | What happened, when, and in what combination? |
| Shape | Continuous number, 24/5 | Discrete finalized fact + occurredAt |
| History | Current round | A past fact stays readable forever |
| Disagreement | — | Bonded two-tier committees, never a token vote |
| Composition | — | AND / OR / NOT / BEFORE / WITHIN, canonical IDs |
| Relationship | A Novak data source | Reads Chainlink; doesn’t replace it |
Network
- Deployed on
- Robinhood Chain testnet — chain ID 46630 (Arbitrum Orbit L2, ETH gas)
- RPC
- https://rpc.testnet.chain.robinhood.com
- Explorer
- https://explorer.testnet.chain.robinhood.com
- Faucet
- https://faucet.testnet.chain.robinhood.com
- Data read from
- Robinhood Chain mainnet (4663) — read-only, no funds
- Collateral
- MockUSDG on testnet (6 decimals); real USDG on mainnet is 0x5fc5…d168
Event catalog
EventSpec.sourceId = keccak256(name); the spec bytes use the SDK encoders. specVersion 2 outcomes carry occurredAt, so BEFORE/WITHIN compare when facts happened, not when they were finalized.
chainlink.price-at.v1 · specVersion 2
“Is NVDA ≥ $250 at 16:00 on Oct 9?”
Source: Chainlink “Robinhood NVDA / USD” feed on mainnet — the round in effect at T (binary search), rejected if older than maxStaleness
rh.corporate-action.v1 · specVersion 2
“Did NVDA have a split-size multiplier change effective this week?”
Source: The stock token’s own ERC-8056 UIMultiplierUpdated(old, new, effectiveAt) logs; minChangeBps separates splits from dividend reinvestment
rh.trading-status.v1 · specVersion 1
“Is TSLA NOT tradable in the overnight session right now?”
Source: Robinhood’s public asset registry (tradingCapabilities per session)
Consume an event from your contract
import { IEventBus } from "novak-contracts/interfaces/IEventBus.sol";
contract MyLendingPool {
IEventBus public immutable novak; // the ONLY Novak dependency
function _corporateActionActive(bytes32 eventId) internal view returns (bool) {
if (novak.getAvailability(eventId) != IEventBus.Availability.Available) return false;
return abi.decode(novak.readOutcome(eventId).outcomeData, (bool));
}
}Hold only an IEventBus reference, and handle Voided if you hold funds. The shipped StockLendingGuard does exactly this.
Create an event
import { NovakClient, SOURCES, sourceId, encodeCorporateActionSpec, STOCK_TOKENS_MAINNET } from "@novakoracle/sdk";
await client.createEvent({
specVersion: 2, // outcome carries occurredAt
sourceId: sourceId(SOURCES.corporateAction),
openTimestamp: weekStart,
observationDeadline: weekEnd + 86_400n,
disputeWindowSeconds: 3_600n,
quorumThreshold: 2,
spec: encodeCorporateActionSpec({
stockToken: STOCK_TOKENS_MAINNET.NVDA,
windowStart: weekStart, windowEnd: weekEnd,
minChangeBps: 5_000, // split-size only
}),
}, account);