Docs v2 · testnet

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 ChainNovak
AnswersWhat is NVDA’s price now?What happened, when, and in what combination?
ShapeContinuous number, 24/5Discrete finalized fact + occurredAt
HistoryCurrent roundA past fact stays readable forever
Disagreement—Bonded two-tier committees, never a token vote
Composition—AND / OR / NOT / BEFORE / WITHIN, canonical IDs
RelationshipA Novak data sourceReads 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

Solidity
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

TypeScript
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);