Oracles
Chainlink feeds behind an adapter that knows when the market is shut.
Every price comes from a Chainlink Data Feed, read through a ChainlinkFeedAdapter that adds
one thing the raw feed does not have: an opinion about whether the market is open.
How many assets can have a market
Counted from Chainlink's reference data directory on 2026-09-17: 35 feeds carry US equity market hours, against roughly 194 Stock Tokens in existence. A market cannot exist without a feed, so that is the ceiling on which assets Paboxo can list — about 18% of them.
Every one of those 35 shares the same configuration: an 86,400-second heartbeat, a 0.5% deviation threshold, and 8 decimals.
You may see it stated that every Stock Token has a live price feed. The directory does not support that, and these docs follow the directory.
Why an adapter
A raw feed reports a price and a timestamp. For an asset that trades continuously, a stale timestamp means something is broken. For a Stock Token it usually means it is Saturday.
Treating those two identically produces one of two failures — freeze the protocol every weekend, or price positions on a number that has been frozen for 60 hours while pretending it is live. The adapter separates them.
Status
Every read returns a status, and the contracts act on it rather than on the raw price alone:
| Status | Meaning | |
|---|---|---|
| 0 | Fresh | The market is open, the answer is within the in-session window, and it was published after the market last closed. Everything allowed |
| 1 | MarketClosed | The exchange is shut per the calendar (or has only just reopened — see reopening). Last price stands and stays readable; borrowing, liquidation and withdrawing collateral from a position with debt pause. Everything else stays open |
| 2 | StaleInSession | The market should be open but the feed has not updated. Treated as a fault |
| 3 | HardStale | Past the hard cap. The price is not usable at all |
| 4 | OraclePaused | The feed's own issuer has paused it |
| 5 | InvalidAnswer | The feed returned something that cannot be a price |
MarketClosed is the only one of these that is a normal condition rather than a problem.
Borrowing, liquidation and withdrawing collateral from a position with debt need both the
collateral and the borrow token to be Fresh. The calendar is consulted before the clock, so a
price that is minutes old is still MarketClosed while the exchange is shut.
Freshness windows
Two limits per adapter:
- In-session max age — how stale a price may be while the market is open before it counts as
StaleInSession. - Hard max age — the absolute ceiling. Past it the price is
HardStaleand unusable, open or closed.
The values, read from the four launch adapters (NVDA, SPY, WETH, USDG) on 12 October 2026, and from all six, SPCX and TSLA included, on 22 October 2026 (block 94915008), and from the MSFT and AAPL adapters on 27 October 2026 (block 99388687), and from the QQQ, GOOGL and AMD adapters on 13 November 2026 (block 113204091):
| In-session max age | 26 hours (93,600 s) |
| Hard max age | 97 hours (349,200 s) |
Every feed has a 24-hour heartbeat, so a window of 24 hours or less would mark a healthy feed stale between two rounds; 26 hours leaves two hours of slack. The hard cap has to outlast the longest closure, a long weekend joined to a holiday (about 81 hours measured), with margin.
oraclePaused
The feed's issuer can pause it. When that happens the adapter reports OraclePaused and the
protocol stops pricing on it, rather than continuing with the last number.
This is a real dependency worth naming: the party that can pause the feed is not the protocol and not you. See risks.
Market calendar
Whether the market is open is decided by a MarketCalendar contract, not by guessing from feed
timestamps. It holds:
- a weekly close window, stored as seconds since Monday 00:00 UTC — so it expresses "Saturday 01:00 UTC until Monday 01:00 UTC", not a time of day;
- automatic daylight saving, computed on-chain from the US rule, so the window shifts without anyone sending a transaction on the switch dates;
- a list of holiday closures as absolute ranges.
The calendar holds 21 holiday closures, the NYSE full-day holidays still ahead from October 2026 through 2028, with automatic daylight saving on (read 12 October 2026). Early closes are not registered. The 2029 holidays are added once NYSE publishes them.
The NVDA, SPY, SPCX, TSLA, MSFT, AAPL, QQQ, GOOGL and AMD adapters point at the calendar. The WETH and USDG adapters deliberately do not — those assets have no market hours.
Why not a TWAP or a pull oracle
A TWAP needs a liquid on-chain market in the asset to average over; Stock Tokens do not have one. A pull-based oracle would let whoever submits the price choose when to submit it, which for an asset with a scheduled close is an invitation rather than a risk. A push feed with a published schedule is the honest fit for an asset with published market hours.