What the venue's data actually contains
measured findings · updated october 2026 · every claim reproducible
Every figure Basisproof reports is recomputed from public venue data. Along the way we measure where the venue's own series disagree, truncate, or carry undocumented semantics. These are construction properties of the data — not accusations — and each is stated so a skeptic can reproduce it against the same public endpoints.
Two official PnL series diverge on builder-dex accounts
The venue's perp portfolio buckets expose two series that should reconcile: a PnL history and an account-value history. On accounts holding open builder-dex positions (xyz, flx, vntl, km, …) they systematically do not — the PnL series excludes builder-dex unrealized PnL while the account-value series includes it.
Measured on a live dex-heavy account (675,582 fills): the two official series diverged by $405.5M over the window, and the divergence is consistent with that account's builder-dex open PnL. This is a construction property of the series, not a data error — but any downstream tool that treats the two as interchangeable imports a nine-figure disagreement.
reproduce it
POST {type:"portfolio", user} to api.hyperliquid.xyz/info — compare the perp* bucket's pnlHistory deltas against accountValueHistory deltas on an account with open builder-dex positions.
measured · verified 2026-10-23, re-measured 2026-10-30
The fills endpoint retains ~30 hours
userFillsByTime returns only the most recent ~30 hours of fills for an address. Everything earlier is absent from the venue endpoint — not truncated with a warning, simply not returned. Any report, export, or recomputation built on this endpoint alone is silently incomplete for older activity.
Full history is available only through chain indexers. We verified an indexer's fill stream cell-for-cell against the venue endpoint on overlapping windows before depending on it.
reproduce it
Query userFillsByTime for any address older than two days of activity — the returned window simply doesn't reach back.
structural · verified 2026-10-23
marginSummary has no unrealized-PnL field
clearinghouseState's marginSummary exposes accountValue but no unrealizedPnl — it must be summed from assetPositions[*].position.unrealizedPnl, which is also main-perp only. A tool that reads marginSummary alone silently drops all open PnL.
reproduce it
Inspect a clearinghouseState response — the field does not exist; sum the per-position values to compare.
structural · verified 2026-10-23
Fill fees are signed — rebates are positive
fill.fee is signed: a value ≤ 0 is a fee paid, a value > 0 is a rebate received. A pipeline that assumes fees are unsigned costs flips the sign of every rebate and misstates net fees on maker-heavy accounts — where rebates are the dominant fee component.
reproduce it
Sum signed fees on any maker rebate account and compare against venue-reported totals — unsigned summation diverges exactly by twice the rebate total.
measured · verified 2026-10-23
The account-value curve is a sampled series, not a ledger
portfolio accountValueHistory is a curve of sampled points (roughly daily), not an event-level record. An identity built from it inherits bracket error: boundary mark-price drift inside a sampling bracket shows up as apparent flow disagreement even when every real flow is classified.
reproduce it
Inspect the timestamp spacing of accountValueHistory points — they are samples, not transactions.
structural · verified 2026-10-23
The ledger carries types outside the documented set
userNonFundingLedgerUpdates returns delta types beyond the documented transfer/deposit/withdraw set: send rows carry sourceDex/destinationDex labels per side ("" = main perp, "spot", or a builder-dex name), perpDexClassTransfer moves margin between perp pools, cStakingTransfer moves HYPE to and from staking, plus vault and genesis records. Each has its own boundary semantics — a send between your own perp and dex pools is internal to the margin universe, while a vaultDeposit is an external outflow.
Misclassifying any of them corrupts an account-value identity. We classify each type explicitly; observed counts and delta shapes are from live ledger data.
reproduce it
Pull userNonFundingLedgerUpdates for any active multi-dex account and enumerate the delta.type values — several never appear in the docs.
measured · verified 2026-10-30
Liquidation losses live in the fills stream
A liquidated position's forced-close executions appear in userFills as ordinary fills — the realized loss is already inside the fills sum. The liquidation row in the ledger is a record of the event, not a separate value movement; counting both double-books the loss.
reproduce it
Compare a liquidation ledger row's positions against same-timestamp fills for that address — they are the same executions.
measured · verified 2026-10-30
Your account, measured the same way
The free check runs this recomputation on your address — fills, funding, signed fees, and a disclosure of wherever the venue's own series fail to agree.