Open dataset · dataset-v1 · CC BY 4.0
Manifest order books, 11–12 September 2026
Every book state of three Manifest markets on Solana over 15.57 hours, top 15 price levels per side, and the moment each state reached each of two independent RPC providers. This is the period every measurement on the main page was made on, so those results can be checked from outside.
- Markets
- cbBTC/USDC · RENDER/USDC · USDT/USDC
- Window (UTC)
- 2026-09-11 17:31:00.800740 → 2026-09-12 09:05:00
- Book states
- 106,440
- Price levels (long format)
- 3,193,200
- Channel arrivals
- 212,108
- Gaps inside the window
- none
- Formats
- Parquet · CSV (gzip)
Download
The files are assets of the dataset-v1 release. Each table comes in both formats with the same rows in the same order. Take Parquet if your tools read it; it keeps types, including exact 38-digit prices.
| Table | Parquet | CSV (gzip) |
|---|---|---|
| levels | 5.8 MB | 11.4 MB |
| states | 8.2 MB | 5.3 MB |
| arrivals | 1.9 MB | 1.8 MB |
| markets | 1.8 KB | 0.4 KB |
| channels | 0.8 KB | 0.1 KB |
| coverage | 0.8 KB | 0.1 KB |
SHA256SUMS lists a checksum for every file. The export is deterministic: the same rows always give the same bytes.
Tables and fields
No field is ever empty. Timestamps are UTC with microsecond precision. Prices and sizes are integers in the smallest on-chain units, exactly as the market account stores them; the next section converts them.
levels
One row per book state × side × level. Join to states on state_id.
| Field | Type | Meaning |
|---|---|---|
| state_id | int64 | The book state this level belongs to. |
| market_id | int32 | The market, repeated from states so a single market can be filtered without a join. |
| side | string | bid or ask. |
| level | int32 | 0 is the best price on its side, then 1, 2… up to 14. Bids fall and asks rise with the level. |
| price | decimal(38,0) | Quote atoms per base atom, multiplied by 1018. Too large for int64: about 7.7×1020 at the cbBTC touch. |
| size | int64 | Resting size at this price in base atoms, summed over all orders at the price. |
states
One row per distinct book state. A new state is recorded when the market account changes, so the time between rows is the time the book stood still.
| Field | Type | Meaning |
|---|---|---|
| state_id | int64 | Identifier of the state. Unique, increasing in order of recording, not contiguous. |
| market_id | int32 | The market; see markets. |
| slot | int64 | The Solana slot the account update was reported for. |
| state_hash | string | SHA-256 of the raw account bytes, hex. With slot it identifies the same state across channels. |
| first_seen_at | timestamp | The earliest arrival of this state over any channel, equal to the minimum of its arrivals.received_at. |
| bid_levels | int32 | How many bid levels the state has in levels (at most 15). |
| ask_levels | int32 | How many ask levels the state has in levels (at most 15). |
arrivals
One row per state per channel that delivered it. A state missing a row for a channel was not delivered by that channel.
| Field | Type | Meaning |
|---|---|---|
| state_id | int64 | The state that arrived. |
| channel_id | int32 | The channel it arrived over; see channels. |
| received_at | timestamp | When the collector received it over that channel. |
markets
| Field | Type | Meaning |
|---|---|---|
| market_id | int32 | Identifier used by the other tables. |
| venue | string | manifest. |
| address | string | The market account on Solana mainnet; the book is this account’s state. |
| base_symbol | string | Base token symbol, e.g. cbBTC. |
| quote_symbol | string | Quote token symbol, USDC for all three. |
| base_mint | string | Base token mint address. |
| quote_mint | string | Quote token mint address. |
| base_decimals | int32 | Decimals of the base token. |
| quote_decimals | int32 | Decimals of the quote token. |
channels
| Field | Type | Meaning |
|---|---|---|
| channel_id | int32 | Identifier used by arrivals. |
| name | string | Channel name: helius, alchemy. |
| kind | string | Always real: emulated channels are never exported. |
| provider | string | The RPC provider behind the channel. |
coverage
| Field | Type | Meaning |
|---|---|---|
| market_id | int32 | The market. |
| from_ts | timestamp | Start of the gap-free recording window. |
| to_ts | timestamp | End of the window. |
| state_count | int32 | Number of states of this market inside the window. |
From atoms to prices
With b and q the base and quote decimals from markets:
price in quote per base = price / 10^18 × 10^(b − q) size in base tokens = size / 10^b
For cbBTC/USDC (b = 8, q = 6) a price of 777037910000000000000 is 77,703.791 USDC per cbBTC. Keep the raw integers for any sum or difference and convert at the end: that is how the terminal stays exact.
Deep levels can sit far from the market: some cbBTC asks rest at 108 USDC and above, and their price runs to 27 digits. In CSV, price is a plain integer. A reader that guesses types turns it into a float and loses the last digits; read it as a string or a decimal (in pandas, dtype={"price": str}).
Quick start
DuckDB reads the files where they lie. The best bid and ask of cbBTC over time, in USDC:
SELECT s.first_seen_at, l.side,
l.price / 1e18 * 10 ^ (m.base_decimals - m.quote_decimals) AS price_usdc,
l.size / 10 ^ m.base_decimals AS size_base
FROM 'quantedge-dataset-v1-levels.parquet' l
JOIN 'quantedge-dataset-v1-states.parquet' s USING (state_id)
JOIN 'quantedge-dataset-v1-markets.parquet' m ON m.market_id = l.market_id
WHERE m.base_symbol = 'cbBTC' AND l.level = 0
ORDER BY s.first_seen_at, l.side DESC;
How far each channel lagged behind the first arrival, at the 95th percentile:
SELECT c.name, count(*) AS states,
quantile_cont(epoch_us(a.received_at) - epoch_us(s.first_seen_at), 0.95) / 1000 AS p95_lag_ms
FROM 'quantedge-dataset-v1-arrivals.parquet' a
JOIN 'quantedge-dataset-v1-states.parquet' s USING (state_id)
JOIN 'quantedge-dataset-v1-channels.parquet' c USING (channel_id)
GROUP BY c.name;
How it was recorded
- One collector held an
accountSubscribeWebSocket subscription per market at each of two RPC providers, Helius and Alchemy, atconfirmedcommitment with base64 encoding. - Each update was keyed by
(slot, SHA-256 of the account bytes)before decoding, so the same state from both providers is one row instatesand two rows inarrivals. - The book was decoded from the Manifest market account, aggregated by price and cut to the best 15 levels per side.
received_atcomes from the clock of the single host that ran the collector. Differences between channels are measurements; the absolute time since the on-chain event is not, and is not in the data.- The collector also records the coverage it had: the window is one segment per market with no gap, which is why it starts at an odd microsecond.
What it is not
- Not the full book. The best 15 levels per side, aggregated by price; individual orders and their owners are not included.
- Not a trade tape. Fills are not recorded, only the book states before and after.
- Not every Solana slot. A row appears when the account changed and a provider reported it.
- Not a provider ranking. Two providers, one host, one night; the lag depends on all three.
Licence and citation
The dataset is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0): use it for anything, including commercial work, and credit the source. The code that recorded and exported it is under the Apache License 2.0.
QuantEdge Terminal. Manifest order books, 11–12 September 2026 (dataset-v1). https://quantedgeterminal.github.io/QuantEdge-Terminal/dataset/. CC BY 4.0.
The export is apps/dataset in the repository. It refuses a window with a gap in coverage and any channel that is not real.