Notes / Audits and snapshots

Hyperliquid: methodology test, 2026-09-16

Audits and snapshots2026-09-16Chain: HyperliquidLinked: HIP-3 dex xyz (trade[XYZ]), Hyperliquid L1 (HyperCore validator set)

Source: chains/hyperliquid/data/methodology_test_2026-09-16.md in the repository, rendered here without changes. Source file

Purpose: apply chains/hyperliquid/METHODOLOGY.md section 4 end to end to real, significant HyperCore targets, read live, and record every place where the written rules were not enough to produce a number. The fixes are in METHODOLOGY.md (sections 4.6, 4.7 and the changelog in section 7).

Reads: 2026-09-16 around 20:05-20:10 UTC, official info API https://api.hyperliquid.xyz/info and official HyperEVM RPC https://rpc.hyperliquid.xyz/evm, read only. Live values drift; the orders of magnitude below are what matters.

Reproduce everything below with one command:

python3 chains/hyperliquid/scripts/methodology_test.py          # full reads + scores (JSON)
python3 chains/hyperliquid/scripts/methodology_test.py scores   # scores only

Result on this run:

TargetadminKeymultisigtimelockoracleAuthoritycrossExposurecomposite
xyz HIP-3 dex (trade[XYZ])1015041009
Hyperliquid L1 (validator set)156504010026

Not published on chain. This is a methodology test only.

Target 1: xyz HIP-3 perp dex (trade[XYZ])#

Why this target#

Largest HIP-3 dex by listed assets. Live read: 120 assets, open interest of about 3.9 billion USD notional (sum of openInterest * markPx from metaAndAssetCtxs with dex: "xyz"), about 1.1 billion USD totalNetDeposit (perpDexStatus). It exercises the HyperCore-only part of the methodology: native multisig, sub-deployers, deployer oracle push.

Identifier and sources#

FactSource 1 (protocol)Source 2 (independent)
Dex xyz, deployer 0x88806a71d74ad0a510b350545c9ae490912f0888perpDexs on the official APItrade[XYZ] official docs, Perpetuals Architecture, "Deployer" row
setOracle authority 0x1234567890545d1df9ee64b35fdd16966e08acecperpDexs.subDeployers["setOracle"]same docs page, "Oracle Updater" row
trade[XYZ] runs "a distributed set of relayer instances" pushing prices about every 3 sn/asame docs page

Note: in perpDexs the dex-level oracleUpdater field is null; the address trade[XYZ] calls "Oracle Updater" is a setOracle sub-deployer. Rule 4.2.3 already covers both paths, so the authority set is the same either way.

Raw reads#

AddressRole(s)userToMultiSigSignersHyperEVM code / nonce
0x88806a71...0888deployer2-of-30x / 0
0x7d16f116...6657sub-deployer: registerAsset, setFeeRecipient, haltTrading, setMarginTableIds, setOpenInterestCaps, setFundingMultipliers, setMarginModes, setDeployerFees, setFundingInterestRates, setPerpAnnotationnull (single key)0x / 0
0xc0892b4f...059dsame as above except setDeployerFeesnull (single key)0x / 0
0x8c419001...0ff2registerAsset, setMarginTableIds, setOpenInterestCaps, setFundingMultipliers, setMarginModes, setFundingInterestRates, setPerpAnnotationnull (single key)not in a scored set
0x12345678...acecsub-deployer: setOracle1-of-60x / 0

Other reads: deployer delegatorSummary.delegated about 500.5k HYPE (the HIP-3 slashable stake is 500k HYPE); no other HIP-3 dex shares any authority address or multisig signer with xyz (10 dexes checked, root keys expanded to signers).

Derivation, dimension by dimension#

DimensionRule appliedDerivationScore
adminKeyScore4.1 (as corrected) + 4.6 ladderRoot-control set = deployer (2-of-3) + haltTrading sub-deployers (two single keys). Weakest by rule 4.2 = single key. haltTrading "cancels all orders and settles positions to the current mark price" (HIP-3)10
multisigScore4.2 + 4.6Same weakest key, single key = (1, 1)15
timelockScore4.3No delay on haltTrading, setOracle, setSubDeployers or multisig signer changes, none found0
oracleAuthorityScore4.4 + 4.6Oracle set = deployer (2-of-3, also implied updater since oracleUpdater is null) + setOracle sub-deployer (1-of-6). Weakest = 1-of-64
crossExposureScore4.50 other HIP-3 dexes share a root key; no HyperEVM code or nonce on any scored authority address, so no cross-layer role to bypass today100
compositeScorerepo _compositefloor(0.4 x 10 + 0.3 x 15 + 0.3 x 0 + 0.5)9

L1 cap (4.5): min(9, 26) = 9, no effect.

Context before qualifying#

Mitigating:

Aggravating:

Qualification: the low score describes the key structure as read, not misuse. No irregular action was looked for or found.

Target 2: Hyperliquid L1 (HyperCore validator set)#

Why this target#

It is the authority behind every HyperCore market and the cap for every other HyperCore target (4.5). Live read: 234 main-dex perps, about 10.3 billion USD open interest (sum of openInterest * oraclePx).

Identifier and sources#

Target key (4.7): 0xeA394CD63CA3a5C8A130Bb2b955cC71C22E5ea6C = last 20 bytes of keccak256("hyperliquid:hypercore-l1").

FactSource
Quorum > 2/3 stake; oracle = stake-weighted median of validator pricesStaking, Oracle
Active set and stakevalidatorSummaries, official API. Single operator source, see gaps
"Foundation validators" exist and the Foundation runs a delegation programDelegation program

Raw reads#

ReadValidatorsEntities (Foundation-labeled merged)
Active2723
Foundation-labeled share of active stake5 validatorsabout 48.0%
Count to exceed 1/33 (36.7%)1 (48.0%)
Count to exceed 1/25 (51.6%)2 (55.0%)
Count to exceed 2/38 (68.3%)4 (66.71%, only 0.04 points above 2/3)

Derivation, dimension by dimension#

DimensionRule appliedDerivationScore
adminKeyScore4.1Signed binary auto-pulled by hl-visor, no public hl-node source15
multisigScore4.2 (as corrected) + 4.6k_f = 4 entities, k_l = 1 entity: min(100, 15 x 4 + 5 x 1)65
timelockScore4.3No documented upgrade notice0
oracleAuthorityScore4.4 (as corrected) + 4.6m = 2 entities over 1/2: 20 x 240
crossExposureScore4.5The L1 is the shared root itself; exposure is expressed as the cap on other targets100
compositeScorerepo _compositefloor(0.4 x 15 + 0.3 x 65 + 0.3 x 0 + 0.5)26

Sensitivity: the entity count for 2/3 sits 0.04 points above the threshold. A small stake shift makes it 5 entities (multisigScore 80, composite 30). Counted per validator without merging, multisigScore would be 100 and composite 36: the merge rule moves this score by 10 points, which is why it had to be written down.

Context before qualifying#

Mitigating: the Foundation-labeled set is below both a simple majority and the 2/3 quorum, so it cannot finalize or move the oracle median alone. Labels are self-set, and merging them is the conservative direction.

Aggravating: the Foundation also delegates stake to other validators and "reserves the right to cease delegation at any time" (delegation program page), so its influence may exceed its own labeled share. Not scored, not measurable from validatorSummaries.

Methodology gaps found#

#GapEffect on this testFixed in METHODOLOGY.md?
G1No dimension had a 0-100 formula; section 4 ordered keys but produced no numberNo score could be derived from the text aloneYes, new 4.6
G24.1 scored a HIP-3 dex on the deployer ladder, while 4.2.3 says sub-deployers bypass the deployerxyz adminKeyScore would be 50 (deployer 2-of-3) instead of 10 (single-key haltTrading)Yes, 4.1 row rewritten, changelog
G3The repo Safe formula 15 k + 5 (n - k) rewards larger n, the approved rule 4.2 says larger n is weakerWeakest-key selection and scoring could disagree (3-of-6 selected as weaker than 3-of-5 but scored higher)Yes, 4.6 formula monotone with 4.2, comparability cost stated
G4L1 coefficients counted validators, not entitiesmultisigScore 100 vs 65 on the same dataYes, 4.2 and 4.4, entity merge
G5"L1 caps all HyperCore targets" and crossExposure had no arithmeticNot computableYes, 4.5
G6SetOracle clamps (1% per update, 2.5 s, 10x start of day) not mentionedA reader could not tell a 1-of-6 push is rate-limitedYes, 4.4, as notes
G7No target identifier for a target without an address (L1)Could not be keyed in the oracleYes, 4.7
G8Only setOracle and haltTrading are classified; xyz has 11 delegated variantssetMarginTableIds / setMarginModes might force liquidations on open positions, not confirmed by a primary sourcePartly: listed as open question in section 6, kept out of the score
G9HyperCore reads still rest on one operator's API (no self-run --serve-info node)For xyz, the two key addresses are confirmed by trade[XYZ] docs; multisig thresholds and validator stake are not independently confirmedNo, infrastructure, still open in section 6
G10Foundation delegated stake to third-party validators is not visible in validatorSummariesL1 entity counts may overstate decentralizationNo, open
G11No primary source for L1 upgrade notice practiceL1 timelockScore 0 by defaultNo, still open in section 6

Verdict: the methodology, after the G1 to G7 fixes, produced every dimension of both targets from live reads with no manual judgment left in the arithmetic. G8 to G11 are open questions that change context or confidence, not the ability to score.

Not an audit, not investment advice. All notes ยท Back to the dashboard.