Methodology
Every figure on the dashboard is computed from the public Hyperliquid info API (POST https://api.hyperliquid.xyz/info), server-side, with the constants in src/lib/metrics.ts. This page is the same text, with those constants filled in. Nothing is mocked: when a call fails the section says "no data" and why.
Wallet under watch: 0xf2460F28C9BaCB35Ac6feF048b661d33Ad070Aaf (APEX MS1, Apex Quant Capital on INFINIT). Every number carries the UTC time its inputs were read.
API calls
| Purpose | Body | Notes |
|---|---|---|
| Perp dex list | {"type":"perpDexs"} | First entry is null, the main dex. Every call below that takes dex is run once per dex. The wallet trades on main (crypto) and xyz (HIP-3). |
| Markets and live OI | {"type":"metaAndAssetCtxs","dex":"<name>"} | [meta, ctxs], zipped by index. Delisted markets are skipped. OI in USD = openInterest × markPx. |
| Positions now | {"type":"clearinghouseState","user":W,"dex":"<name>"} | Per dex; marginSummary.accountValue summed across dexs is total equity. |
| Equity and PnL history | {"type":"portfolio","user":W} | Used for the cross-check only (allTime.pnlHistory[-1]). Its points are weekly in August and daily after, so the curve is built from fills instead. |
| Fills | {"type":"userFillsByTime","user":W,"startTime":<ms>,"aggregateByTime":true} | 2,000 per page; next page starts at max(time)+1. Full-precision prices are stored as strings. |
| Funding | {"type":"userFunding","user":W,"startTime":<ms>} | 500 per page, same pagination. Positive usdc is received. |
| Deposits and transfers | {"type":"userNonFundingLedgerUpdates","user":W,"startTime":0} | deposit, withdraw, send (dex-to-dex moves are self-sends with destinationDex), vaultDeposit, vaultWithdraw. |
| Daily closes | {"type":"candleSnapshot","req":{"coin":C,"interval":"1d","startTime":<ms>,"endTime":<ms>}} | t is the candle open (00:00 UTC); its close belongs to that calendar day. One call per market the wallet has ever traded. |
| Order-level book | Alchemy HyperCore l4BookUpdates (websocket, coins: [...]) | One snapshot across every traded and eligible market, all from the same HyperCore block. Not part of the public API. |
Calls are queued server-side with at least 350 ms between them and retried with backoff on non-JSON or 5xx answers. The browser never calls Hyperliquid directly.
Definitions
- BASE, the capital base: sum of ledger
depositminus sum ofwithdrawmade before the vault's redeemable date.vaultDepositandvaultWithdraw(the three days the funds sat in the native HL vault "Infinit Multi-Strategy", 10% leader commission, 3 to 6 Aug 2026) and self-sends between dexs are excluded. For MS1 this is 506,142.39 USDC. - Staging result: the funds sat in the native HL vault from 3 to 6 Aug and came back 282.41 USDC lighter (
vaultWithdraw.netWithdrawnUsd− ΣvaultDeposit.usdc). That loss is in account value but in no fill, so it is added as a constant to every daily mark and listed next to the attribution; it is not part of BASE. - t0: time of the first fill (10 Aug 2026 02:14:21 UTC).
portfolio.allTime.pnlHistorystarts at 0 on 5 Aug (deposit); day counts start at the first fill. - Maturity: a
withdrawon or after the redeemable date is a distribution, capital plus result leaving HyperCore for redemption on INFINIT. It is added back to equity, not taken off BASE, the daily series ends on the day it left, and the day count stops there. MS1 matured on 28 Oct 2026 10:26 UTC: 549,326.14 USDC withdrawn (two withdrawals, 1 USDC fee each), 0.01 USDC left on the wallet. - PnL now = Σ over dexs of
accountValue+ distributed − BASE. Cross-checked againstportfolio.allTime.pnlHistory[-1]; the two must agree within $50 and the hero shows the delta when they do not. - Return = PnL now / BASE.
- Annualised, simple = Return × 365 / days since t0. Not compounded. This is the convention Apex uses for its own figure. Days are fractional.
- Daily MTM series (the equity curve): for each calendar day d since t0, realised(d) + unrealised(d).
- realised(d) = cumulative Σ(closedPnl − fee) over fills with time < end of d, plus cumulative funding usdc to the end of d. - unrealised(d) = Σ over positions open at the end of d of qty × close(d) − cost basis, where the cost basis is the signed average entry per market tracked from the fills (the same average-entry convention Hyperliquid reports as entryPx; FIFO is not needed). - close(d) is the 1d candle close for that calendar day. HIP-3 markets have no candle on days they are closed; the last known close is carried forward and those days are listed in the build notes. - The final point is replaced with PnL now from the API so the curve ends on the authoritative figure. - Days with zero open positions are marked "cash" and shaded.
- Peak and Low: max and min of the MTM series.
- Max drawdown = min over d of (MTM(d) − peak(d)) / (BASE + peak(d)), with the running peak starting at the staging result (the PnL carried into t0). On daily marks; intraday may be worse.
- Gross exposure(d) = long notional + short notional at the daily close. Net(d) = long − short. Net/gross = |net| / gross, reported as the average over active days (gross > 0) and the worst day. Peak gross / capital = max gross / BASE.
- Leverage check: every open position has
leverage.type == "isolated"andvalue == 1, and gross / capital ≤ 1.05. - Attribution: per market and per asset class, net realised = Σ(
closedPnl−fee) + Σ funding. Realised only; unrealised PnL on open positions is not attributed. Classes: crypto (no prefix), index (xyz:SP500,xyz:XYZ100), commodity (xyz:GOLD,xyz:SILVER,xyz:CL,xyz:BRENTOIL), equity (every otherxyz:name). The map lives insrc/lib/markets.ts. - Eligible universe: every live perp, on any dex, with OI ≥ $100M right now.
- Slot size at launch: notional of each opening fill in the first 60 minutes after t0. The median of those is the "slot" used in the book section.
Mandate monitor
- Every open position 1x isolated (from
clearinghouseState). - Gross exposure ≤ capital (tolerance 1.05x).
- Every open position in a market with OI ≥ $100M right now.
- Net/gross below 10% at the last daily close with open positions.
- No withdrawals from the trading wallet before maturity (ledger
withdrawcount before the redeemable date = 0).
Drawdown circuit breakers and first-loss capital are not observable from any public endpoint and are rendered as such.
Order-level book (Alchemy)
The "Under the book" section is the only part not computed from the public API. One l4BookUpdates subscription on Alchemy's HyperCore stream returns every resting order, with its wallet, for every market in the subscription, as of one HyperCore block. For each market: the L4 mid (best bid and ask), resting notional inside ±10 bp of that mid on each side, distinct wallets inside the band, the largest wallet's share of that depth, the vault's own resting orders (matched by wallet address), and the launch slot as a share of each side's depth. The snapshot takes 5 to 25 seconds, so it loads after the page and refreshes every 90 seconds while the tab is open.
Trade log and sharing
The trade log is every userFillsByTime row for the wallet, newest first, with dir, size, full-precision price, notional (price × size), closedPnl, fee and the transaction hash linked on hypurrscan. The CSV adds oid, tid, feeToken and whether the fill crossed the spread. Share menus copy a deep link to the section, download that section's 1200×630 image (/api/og/<vault>/<section>, rendered from the same data at request time), or open an X post with the link.
Deposits, onchain (Arbitrum)
INFINIT's vaults take USDC on Arbitrum through a vault manager contract (0xaFE480f375EBd13dF703ef50b429357d29D162Ee). Each deposit emits Deposit(user, vaultId, amount) and mints the vault's receipt token (inUSDC) 1:1; redemptions burn it. The Deposits section is the sum of those events per vault, read from the public Arbitrum RPC into Postgres by a cron every five minutes (and on request when the stored cursor is older than four minutes), with one chart point per deposit and a link to every transaction on Arbiscan. Vault 1 (MS1) reconciles to INFINIT's own figures: 28 deposits, 506,137.39 USDC. MS2 and MS3 are vaults 2 and 3 on the same manager (created 28 Oct 2026 10:54 and 10:57 UTC); their shared deposit window closes 11 Nov 2026 12:00 UTC per INFINIT's announcement, and the status pill flips to "window closed" at that minute. Their trading wallets are not public yet, so the return, exposure and trade sections cover MS1 only until vaults.ts carries them.
Caveats, as found
- The wallet is split across two dexs (main for crypto,
xyzfor HIP-3). Every position, equity and OI figure is per dex and summed. - Fills on
xyzcarry long decimal prices (1218.9365170643). Full precision is kept; rounding happens only in the UI. - On 10 Aug the wallet shorted about $45K of
HYPERand closed it the next day. It is in the trade log and the attribution as is. - The book went fully to cash on 13 to 16 Aug and 28 to 30 Aug, and again from 27 Oct ahead of the 28 Oct redemption date. Zero positions is a valid state.
candleSnapshotwas seen taking 6 to 20 s per call on 28 Oct 2026, so closes are cached per market and day in Postgres and only the last two days are re-read on each build.- The daily snapshot (00:05 UTC cron and after every successful build) is served, with a banner, when a live build fails. A partial series is never rendered as complete.
Reconciliation
As of 26 Oct 2026 20:14 UTC the replay (node scripts/replay.ts) gives: 340 fills, $12,032,096 volume, fees $2,239.75, funding +$3,124.17, max drawdown 3.70% (10 to 18 Aug), peak +$42,933 on 23 Oct (the spec's +$43,215 before the −$282 staging result), net/gross average 0.99% over 71 active days (worst 7.5% on 18 Aug), peak gross 1.04x, attribution crypto +$50,250 / commodity +$12,860 / index −$3,154 / equity −$24,798, matching the targets in the spec. The daily MTM series matches the portfolio points on the days they exist with a median absolute delta of $233 (39 points, largest $2,619 on 12 Oct).