Docs. How the mark is made.
MARK is a fair-value oracle for tokenized stocks on Robinhood Chain. It publishes, for each name, a mark and a confidence band every four seconds, 24/7, signed with a persistent ed25519 key, and it exposes an on-chain contract for staked publishers to push the same numbers.
1. Regimes
The NYSE calendar (America/New_York, full closures and 13:00 half days included) decides the regime for every instant:
| Regime | When | What the mark is |
|---|---|---|
| OPEN | 09:30–16:00 weekdays | The official tape. Pools and xStocks only tighten or widen the band. |
| PRE / POST | 04:00–09:30 · 16:00–20:00 | Extended-hours prints, Robinhood Chain pools, xStocks, futures proxy. |
| CLOSED | Nights, weekends, holidays | Pools + xStocks + futures proxy. The official close decays over 72 hours. |
2. Sources
- Official tape: the regular-session print and its timestamp. In CLOSED its weight decays linearly to 25% over three days.
- Extended-hours print: the last pre or post-market trade, weight fading over 12 hours.
- Robinhood Chain pools: every pool where the tokenized stock is the base token against USDG, USDC, USDT or WETH with at least $25k liquidity. Each pool is its own vote weighted by liquidity share, halved if it printed no trades in the last hour. The pool bucket scales with total liquidity up to $1.5M.
- xStocks: the Backed xStock of the same name on Solana, which trades 24/7. Weight scales with its liquidity up to $800k.
- Futures proxy: official close × (1 + β × index-futures move since that close). ES for broad names, NQ for tech. β is regressed from three months of daily returns and clamped to [0.2, 3.5].
- Pyth (optional): equity and xStock feeds if a Hermes gateway is configured. Public Hermes is key-gated as of 2026, so MARK runs without it by default.
Base weights
| Regime | Tape | Ext | Pools | xStock | Proxy |
|---|
3. Blend
A preliminary weighted median is taken across all sources. Any source more than 800 bps from it is rejected and listed under rejected in the feed. The mark is the weighted median of the survivors, so one manipulated pool cannot drag it. Confidence in bps is max(floor, 1.5 × weighted mean absolute deviation) + min(150, 3 × hours since the official close), with floors of 5 (open), 15 (pre/post) and 25 (closed) bps. basis.pool reports where Robinhood Chain pools sit against the mark; a persistently rich basis is a real arbitrage signal, not an oracle error.
4. API
| Endpoint | Returns |
|---|---|
| GET /api/board | Every feed: mark, conf, session, official print and age, basis, seq. |
| GET /api/stream | Server-sent events, the board every 4s. |
| GET /api/feed/:SYM | Full detail: sources with weights and deviations, rejected sources, β, futures, history, underlyings. |
| GET /api/feed/:SYM/signed | The signed payload, signature, signer. |
| GET /api/verify?payload&sig[&pub] | {valid} against the server signer or a supplied key. |
| GET /api/signer | The ed25519 public key and payload format. |
| GET /api/history/:SYM | [[ts, mark, conf, session]], 20s cadence. |
| GET /api/config | Board, chain, parameters, token mint, oracle address. |
Signed payload
MARK|TSLA|35837818547|255764158|1788415417|CLOSED|101
sym mark·1e8 conf·1e8 unix s session seq
sig = ed25519(payload) pub = 32-byte raw key (hex)
Fixed-point integers so that Solidity, Rust and JS rebuild the exact bytes. mark·1e8 and conf·1e8 are the same int64 / uint64 the contract stores.
5. Contract
MarkOracle.sol on Robinhood Chain (chainId 4663). Feed ids are keccak256("MARK:" ‖ SYMBOL).
addStake(amount)/removeStake(amount): lock $MARK to become a publisher.post(feedId, price, conf, publishTime, session)andpostMany(...): push a report. Requires stake ≥minStake.getPrice(feedId): free view. Median price across fresh (≤maxAge) staked reports, max conf, latest session, report count. Reverts when stale.pullPrice(feedId): same, but chargesreadFee$MARK and splits it across the publishers used.slash(feedId, publisher, challenger): guardian slashes 20% of a publisher whose fresh report is more than 2× conf from the median; the slash goes to the challenger.
Addresses are published at /api/config.
6. $MARK
Utility token on Robinhood Chain. Publishers stake it, on-chain reads pay in it, slashes are paid out in it. It does not entitle holders to anything else and it is not a claim on the protocol.
7. Trading · MarkPerps.sol
MarkPerps.sol is the venue. USDG collateral (6 decimals), one liquidity pool as counterparty, up to 10×, 8 bp fee per side to the pool, 5% maintenance, 20% of remaining margin as liquidator bounty, open interest capped at 4× the pool. Every open, close and liquidate takes a Px struct: the symbol, mark·1e8, conf·1e8, timestamp, session and the oracle's secp256k1 signature (r, s) over sha256("MARKv1" ‖ sym ‖ price ‖ conf ‖ ts ‖ session). Fetch it from /api/feed/:SYM/evm; it is valid for 90 seconds. Fills are mark ± conf/2. PnL = size × (exit − entry) / entry, paid from and to the pool. The practice desk at /desk runs the same rules on paper balances for anyone who wants to learn the venue first.
8. Disclaimers
MARK is price infrastructure. It takes no custody and holds no user funds. A mark is an estimate with a stated confidence band, not a promise that any venue will trade there. Nothing here is investment advice. Integrators should check session and conf before trusting a number, exactly as they should with any oracle.