A stock feed's price does not say which market session produced it. Bell does: one call on Robinhood Chain mainnet returns ALLOW, WAIT or REJECT, with the reason, for any of its 35 Chainlink equity feeds
Tokenized stocks on Robinhood Chain trade around the clock. The exchange behind them is open six and a half hours a day. Every Chainlink equity feed on the chain answers latestRoundData() at 03:00 on a Sunday with a real number, often more than a day old, and nothing in the answer says the exchange is shut.
I first assumed the out-of-hours price must be worse, and measured it: 968,799 swaps and $409M of USDG volume in 58 tokenized-stock pools over one week. It is not materially worse. The median gap between pool and feed is 0.168 % in the session, 0.162 % on weeknights and 0.063 % at weekends, with three controls in the repo. So the defect is not accuracy. It is that the number does not carry its session.
That missing session label already sits under real money on this chain.
In the one live stock prediction market I found by 2026-09-21, 28 of 30 settlements (95 % Wilson interval 78.7 % to 98.2 %) read the same feed round at lock and at settle, so a tie rule decided them rather than a price move. Most were locked and settled seconds apart, with 0.009 ETH staked in all: a mechanism, not a loss. Its author had found the tie problem first and fixed it on 2026-09-22; the repo credits that.
On Morpho Blue, 735,891 of the 1,623,948 USDG ever borrowed against stock tokens on this chain was lent while NYSE was shut, and 304,053 of it on a price older than the feed's own 24-hour heartbeat. On Sunday 2026-09-27 one transaction borrowed 300,000 USDG against prices printed 33 hours earlier. No loss followed, the loans sit at about 39 % loan-to-value, and the repo says so. The point is that nothing in those markets records which session a loan was priced in.
What is deployed on Robinhood Chain mainnet (chainId 4663), with no owner and no upgrade path:
PushFeedGuard (0x8aF68a9fF7583097A7476060C6B56eB33dA7a711): one stateless call tells a contract whether a reading from any of the 35 equity feeds is fit to act on now and, if not, why: NO_SESSION, OUTSIDE_SESSION, PRICE_STALE, ROUND_INCOMPLETE, BAD_PRICE or NO_FEED. The NYSE calendar for 2026 and 2027 is compiled in, half days and DST included, and checked against NYSE's published schedule for every day of both years.
SessionLog (0xc482943C7fEE1dD7807Edad1c88260E4263fD0Ad): a permissionless, write-once record of what each feed said at each bell.
SettleOnMark (0x484720AA05BcF183d80B6c2747163f47501aeae9): a USDG trade that pays only on a recorded closing mark and refunds otherwise. It settled for real on 2026-09-22: an MSTR mark at 19:58:05 UTC, a 168.00 strike, 0.40 USDG paid to the short side. The stakes were 0.20 USDG a side, so this proves the path, not a market.
Bell (0x88a5a0414c9fd615201814ddbec4e4d9e4d283d0): the Data Streams half. It verified two real DON-signed reports through the official Chainlink verifier on mainnet, and then refused to serve them because they were stale.
At least ten other projects in this buildathon, or built for it, answer part of the same question. The README has a table that cites, for each one, the line of code that decides whether the exchange is shut. Three of them encode the calendar over more years than mine. Nokturn measures off-hours execution too (worse in the tail, per its README); none splits the pool-to-feed gap by session. AfterHours Oracle found the same 300,000 USDG Sunday loan on its own and labels its borrows by a weekday clock; my replay labels all 308 loans on the NYSE calendar.
I attacked my own design: six attacks on the money, each a test. One works: if nobody writes the closing mark, a loss becomes a refund. It cannot be fixed inside the contract without inventing a price, so the repo ships a keeper.
What is not proven: nobody outside this repository uses it yet.
To check any of this without a wallet: python script/verify.py. It reads the deployed contracts and fails if a headline number in the README drifts from the data file it came from.