ops(script): HyperEVM token deploy (RAI-1511) - #278
Conversation
📝 WalkthroughWalkthroughChangesHyperEVM gap-fill deployment
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
e62574b to
febb397
Compare
8ada2a7 to
456dcf4
Compare
06a06a1 to
8dcc2c4
Compare
5651ace to
12e57b0
Compare
103833b to
6a9b197
Compare
c3b9c96 to
eb39cdb
Compare
6a9b197 to
866cabe
Compare
866cabe to
2d5c3bf
Compare
eb39cdb to
2166e37
Compare
2d5c3bf to
e421b17
Compare
2166e37 to
939bc0a
Compare
939bc0a to
5e26954
Compare
e421b17 to
eb0a0a4
Compare
5e26954 to
8b1ecb5
Compare
eb0a0a4 to
7e515e4
Compare
8b024bb to
c95c9cf
Compare
1117683 to
3548b6c
Compare
c95c9cf to
6ce221a
Compare
3548b6c to
1117683
Compare
19c2376 to
8dc140c
Compare
1117683 to
6e82100
Compare
The initial HyperEVM token bootstrap as a gap-fill: the same self-scoping shape as the executed Ethereum gap-fill, joined against the (all-zero) productionTokensHyperEvm() table — so the first dispatch deploys the whole 29-token canonical set, a partial failure recovers by re-dispatch, a token added pre-execution is picked up automatically, and a fully-hydrated table refuses to mint duplicates (NoMissingTokens). Per token, identical to the executed Ethereum flow: 0.1.1 unified deployer (initialAdmin = deploy key) -> receipt readback -> setAuthorizer(HyperEVM V4 authoriser) -> transferOwnership(HyperEVM Safe). Pre-flight hard-gates encode the RAI-1511 ordering: 0.1.1 core deployed, in-use beacons HyperEVM-Safe-owned (beacon-owner migration), authoriser pin hydrated, Safe pin hydrated — an early dispatch is a typed revert, never a partial deploy. Registered in manual-broadcast (dispatch on `network = hyperevm`). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VPs1hCTxusmaSeFKvoc4Kr
rainix declares and consumes RPC_URL_HYPEREVM_FORK, but neither rainix-sol.yaml nor rainix-sol-scheduled.yaml in this repo passed it, so the reusable workflow fell back to its default and every HyperEVM fork test hit the public rpc.hyperliquid.xyz endpoint — failing with rate limits (-32005) on the token-table suites and invalid block heights on the parity check. The repo secret being set had no effect because it was never forwarded. Unblocks the HyperEVM legs on both this stack and the governance-timelock stack above it.
8dc140c to
e259ff3
Compare
The HyperEVM gap-fill was authored from its Ethereum sibling, and six doc comments carried the source chain's name into text describing THIS script's own subject: the NoMissingTokens and TokenTableMisaligned notices, the tableUnderlying param, _assertAuthoriserReady (over a body returning STOX_PROD_AUTHORISER_V4_CLONE_HYPEREVM), _selectMissing (over productionTokensHyperEvm()), and run. The deliberate cross-references are untouched: the contract NatSpec still names 20260722-deploy-missing-tokens-ethereum as the shape this one copies, the per-token flow is still described as identical to the executed Ethereum flow, and ISetAuthorizer still points at the 20260706 script. Those name other scripts on purpose. Comments only — no executable Solidity, test, or workflow changes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Two documentation defects fixed. No executable Solidity, test, or workflow changed — the diff is six 1. Chain-name references corrected in
|
| Line | Was | Context that makes it wrong |
|---|---|---|
| 38 | fully-hydrated Ethereum table entry |
NoMissingTokens is raised off the HyperEVM table |
| 43 | the Ethereum token table have drifted |
TokenTableMisaligned compares against the HyperEVM table |
| 49 | The Ethereum table's underlying at that row |
same error's @param tableUnderlying |
| 96 | Assert the Ethereum V4 authoriser |
body returns STOX_PROD_AUTHORISER_V4_CLONE_HYPEREVM |
| 110 | Ethereum table entry is all-zero |
body reads productionTokensHyperEvm() |
| 146 | still missing from the Ethereum table |
run() deploys against the HyperEVM table |
Deliberately left alone, because they name a real other script rather than this one's subject:
- the contract NatSpec naming
20260722-deploy-missing-tokens-ethereumas the shape this one copies (lines 62-63); - "identical to the executed Ethereum flow" (line 70), whose own clause then correctly says HyperEVM authoriser and HyperEVM Safe;
- the
ISetAuthorizerpointer at "the 20260706 script" (line 234).
"Ethereum" and "HyperEVM" are both 8 characters, so no comment re-wrapping was needed and every line stayed within its existing wrap.
2. PR body rewritten to describe the post-execution state
The body described a pre-execution world: it called the table "(all-zero)" and said "the first dispatch deploys the whole 29-token canonical set". Both were true when written and are false now — the deploy executed 2026-07-24 (manual-broadcast run 30114307165, a successful workflow_dispatch at 2026-07-24T17:46:18Z), and productionTokensHyperEvm() was pinned fully hydrated by #277 (8be65e553bf5d5027e4146838228cbd69614a834).
I verified the hydration directly rather than taking it on trust: all 29 rows are populated and the table contains zero zero-addresses, so _selectMissing() reverts NoMissingTokens and the script is inert as merged. That matches what testSelectionRevertsWhenTableFullyHydrated already asserts.
The rewritten body records the execution, the inertness, and the remaining value (provenance plus the machinery a late-added token would re-dispatch into), and keeps the pre-flight ordering paragraph, which is still accurate.
Gates
Run under the repo's own nix develop toolchain (forge 1.6.0-nightly):
forge build— passforge fmt --check— passforge test— passpre-commit run --all-files— the Solidity-relevant hooks pass.deadnixandnixfmtfail onflake.nix, which is byte-identical tomainand untouched by this PR; CI'sstaticjob is green on the same file, so that is local toolchain drift, not a regression here.
Note for anyone reproducing locally: a fresh clone needs forge soldeer install before forge build, otherwise the build dies with several hundred unresolved-import errors.
|
Reviewed 5248ac4: approve |

The HyperEVM token bootstrap (RAI-1511), landing as the provenance record of
a deploy that has already run: EXECUTED 2026-07-24 by manual-broadcast run
30114307165, which deployed all 29 canonical tokens, wired them onto the
HyperEVM V4 authoriser, and handed them to the HyperEVM Safe. The resulting
tuples are pinned in productionTokensHyperEvm() by #277.
The script is self-scoping — it joins the canonical config against
productionTokensHyperEvm() and selects only the all-zero rows — so against
the now fully-hydrated table
_selectMissing()revertsNoMissingTokens.It is therefore inert as merged: it cannot re-mint what it already deployed.
What it still carries is the record of how those 29 tokens came to exist,
plus live machinery for a token added to the canonical set later — such a
token lands as an all-zero HyperEVM row, and a re-dispatch picks it up
automatically with no edit to this script.
Per token, identical to the executed Ethereum flow: 0.1.1 unified deployer
(initialAdmin = deploy key) -> receipt readback -> setAuthorizer(HyperEVM
V4 authoriser) -> transferOwnership(HyperEVM Safe). Pre-flight hard-gates
encode the RAI-1511 ordering: 0.1.1 core deployed, in-use beacons
HyperEVM-Safe-owned (beacon-owner migration), authoriser pin hydrated,
Safe pin hydrated — an early dispatch is a typed revert, never a partial
deploy. Registered in manual-broadcast (dispatch on
network = hyperevm).Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01VPs1hCTxusmaSeFKvoc4Kr
Summary by CodeRabbit
New Features
Bug Fixes
Tests