pin(tokens): hydrate the Ethereum token table + add RKLB to the canonical set - #259
Conversation
📝 WalkthroughWalkthroughThe production token configuration and invariant tables now contain 29 entries. RKLB is added with its receipt-vault metadata and Base contract constants, while the Ethereum table is populated with pinned addresses and includes the RKLB entry. ChangesProduction token expansion
Estimated code review effort: 3 (Moderate) | ~20 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 |
4c58500 to
6769314
Compare
6a7b8f7 to
2cd7aa7
Compare
6769314 to
9bb42eb
Compare
2cd7aa7 to
41b3259
Compare
896bd49 to
b1dc6d0
Compare
2f2c066 to
7987c9a
Compare
6c76d46 to
01320f8
Compare
3582977 to
b73c1ee
Compare
01320f8 to
ff79759
Compare
b73c1ee to
87037bb
Compare
ff79759 to
617448f
Compare
87037bb to
b35fc45
Compare
c8c1f58 to
f81e32d
Compare
034312f to
3f22ced
Compare
4b4d1c1 to
a9c983c
Compare
da20cf9 to
73a2683
Compare
DRAFT / DO NOT MERGE. Flips all 20 rows of productionTokensEthereum() from address(0) to address(1) so this pin PR's diff is visible now. Replace each address(1) with the deployed receipt / receiptVault / wrappedTokenVault address per token to hydrate the table. CI is RED by design until then (the token leg + the partial-hydration guard activate against code-less sentinels); flips green when the real addresses land. Land AFTER the Safe + clone pins. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VPs1hCTxusmaSeFKvoc4Kr
The 20260706 broadcast executed on Ethereum mainnet 2026-07-22 (manual-broadcast run 29921218929): all 28 tokens deployed via the 0.1.1 unified deployer, each wired onto the Ethereum V4 authoriser and handed to the Ethereum token-owner Safe in the same broadcast (84 txs, zero failures). Hydrate productionTokensEthereum() from the run's logged (underlying, receipt, receiptVault, wrapped) tuples; first + last vaults spot-verified live (authoriser, owner, receipt readback). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VPs1hCTxusmaSeFKvoc4Kr
…Ethereum deploy
RKLB is live production on Base (Safe-deployed at block 41704399,
Safe-owned, on the V1-address production beacons) but was accidentally
omitted from every table in this repo — so no invariant covered it, the V4
authoriser swap batch (table-enumerated) skipped it, and the 28-token
Ethereum broadcast (config-enumerated) never deployed it.
- LibProdTokenConfig: RKLB row ("Rocket Lab USA Inc ST0x" / tRKLB) —
validated against the live Base vault by the config suite.
- LibTokenInvariants: Base constants + row 29 (receipt 0x34Bf3d8D, vault
0xf6744Fd9, wrapped 0xF4f8c660); Ethereum row 29 deliberately all-zero —
the explicit "missing on this chain" state the parity pin flags and the
gap-filling deploy targets.
- New `20260722-deploy-missing-tokens-ethereum` broadcast script
(manual-broadcast registry): self-scoping counterpart of the EXECUTED
20260706 deploy — joins canonical config vs the Ethereum table by index
(underlying-aligned, misalignment aborts) and deploys exactly the
all-zero rows; a fully-hydrated table refuses to deploy
(NoMissingTokens). Same per-token flow: 0.1.1 unified deployer,
setAuthorizer(Ethereum V4 authoriser), transferOwnership(Ethereum Safe).
Live-fork sweep with RKLB in the table: config + uniform-ownership legs
green (RKLB is Safe-owned, canonical name/symbol match); the strict
uniform-authoriser legs red on the first still-V3 vault as designed — RKLB
joins the 6 in the self-scoping 20260722 swap batch, one Safe signing
covers all 7.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VPs1hCTxusmaSeFKvoc4Kr
The six-vault bundle authored from 20260722-swap-remaining-vault-authorisers is already partially signed (2-of-3); regenerating a combined 7-tx bundle would change the SafeTxHash and void those signatures. RKLB — added to the canonical table after that bundle was authored — gets its own single-tx run-script authoring instead: same pre-flight (Safe state, V4 authoriser codehash + full grant map, RKLB strictly on V3), single setAuthorizer tx, SafeTxHash against the live nonce, simulate-as-Safe, RKLB-scoped post-state (deliberately not whole-table uniformity — the six-vault bundle executes independently), artifact, forward-only n+1 re-issue proof. The two bundles target disjoint vaults and are order-independent. Registered in run-script.yaml. Fork suite: happy path pins the artifact to exactly one tx targeting the RKLB vault; inverted guards cover already-swapped and unknown-authoriser aborts. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VPs1hCTxusmaSeFKvoc4Kr
manual-broadcast run 29924926246 deployed RKLB on Ethereum mainnet 2026-07-22 via the gap-filling script: receipt 0xFf5b15a4, receiptVault 0xED0c085d, wrapped 0x8FC87Be7 — verified live (authoriser = the Ethereum V4 authoriser, owner = the Ethereum Safe, receipt readback matches). Pin the tuple, flip the script status to EXECUTED, and flip the selection test to its post-execution shape: a fully-hydrated table refuses to author (NoMissingTokens), the guard against duplicate-minting re-dispatch. The full 29-token Ethereum parity leg passes against live mainnet. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VPs1hCTxusmaSeFKvoc4Kr
73a2683 to
8dbb87c
Compare
a9c983c to
849ddcc
Compare
The last run predates the Safe transaction that moved RKLB's Base receipt vault onto the V4 authoriser. These are live-fork tests, so their verdicts expire: the three ReceiptVaultAuthoriserMismatch failures describe a chain state that no longer exists. 0xf6744Fd94e27c2f58F6110aa9fDC77A87e41766B now reports authorizer() 0x315b16faa6eE413faBCa877d3851B3818369f0cD, read on three independent Base RPCs. Nothing in the tree needs to change for that to be true, so there is nothing to commit but the trigger. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/lib/LibTokenInvariants.sol (1)
335-345: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winStale doc counts and placeholder narrative after the 28→29 hydration. The tables were expanded to 29 and the Ethereum table fully hydrated, but surrounding documentation still describes the old 28-entry, all-placeholder state, which now contradicts the code.
src/lib/LibTokenInvariants.sol#L335-L345:productionTokensEthereumdocstring still declares the table is**ALL PLACEHOLDERS** (address(0))and "28 production token instances" — rewrite to reflect the pinned/deployed 29-token state (the@returnat L345 also still says 28).src/lib/LibTokenInvariants.sol#L296-L301: the@returnforproductionTokensBasestill says "28 production token instances on Base"; update to 29.src/lib/LibProdTokenConfig.sol#L44-L45: the@noticestill says "28 production token deploy configs"; update to 29.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/lib/LibTokenInvariants.sol` around lines 335 - 345, Update documentation for the 29-token hydrated state: in src/lib/LibTokenInvariants.sol lines 335-345, revise productionTokensEthereum’s notice to describe pinned/deployed entries, remove the all-placeholders narrative, and change the return count to 29; in src/lib/LibTokenInvariants.sol lines 296-301, change productionTokensBase’s return count to 29; and in src/lib/LibProdTokenConfig.sol lines 44-45, change the production token deploy config count to 29.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@src/lib/LibTokenInvariants.sol`:
- Around line 335-345: Update documentation for the 29-token hydrated state: in
src/lib/LibTokenInvariants.sol lines 335-345, revise productionTokensEthereum’s
notice to describe pinned/deployed entries, remove the all-placeholders
narrative, and change the return count to 29; in src/lib/LibTokenInvariants.sol
lines 296-301, change productionTokensBase’s return count to 29; and in
src/lib/LibProdTokenConfig.sol lines 44-45, change the production token deploy
config count to 29.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 476827d9-a8dc-4cf5-af15-aeee7a8ef7ef
📒 Files selected for processing (2)
src/lib/LibProdTokenConfig.solsrc/lib/LibTokenInvariants.sol
|
Reviewed 844f488: approve Fresh run 29984980625 (06:25 UTC, after the Safe bumped RKLB's Base authoriser) leaves one test failure — The Ethereum hydration verified against mainnet, not taken from the broadcast log. I sampled four rows — first, middle, last, and RKLB — and all four are clean:
Every sampled receipt vault is owned by the Ethereum Safe, wired to the Ethereum V4 clone, its RKLB was the interesting part of this review. Its Base receipt vault Worth recording for whoever picks up the RKLB thread: it is absent from This also arms the last pending leg of the cross-chain parity suite: with the Ethereum token table hydrated, |

Pins the full Ethereum production token table and completes the canonical set with RKLB (previously an accidental omission from every table in this repo). PINS ONLY — the RKLB operational scripts live in the follow-up ops PR (#271).
Ethereum table hydration. The
20260706-deploy-tokens-ethereumbroadcast executed 2026-07-22 (run 29921218929): 28 tokens deployed via the 0.1.1 unified deployer, each wired onto the Ethereum V4 authoriser and handed to the Ethereum token-owner Safe — 84 txs, zero failures.productionTokensEthereum()is hydrated from the run's logged(underlying, receipt, receiptVault, wrapped)tuples; first + last vaults spot-verified live.RKLB pins. Live production on Base (Safe-deployed at block 41704399, Safe-owned, V1-address production beacons) but absent from every table — so no invariant covered it, the V4 swap batch skipped it (still on the V3 authoriser), and the Ethereum broadcast never deployed it. This PR adds the
LibProdTokenConfigrow + Base table row 29 (validated against the live Base vault), and the Ethereum row 29 pinned from the executed gap-fill broadcast (run 29924926246), verified wired live.The full 29-token Ethereum parity leg passes against live mainnet. The strict Base uniform-authoriser invariants stay red until the two pending Safe bundles (6-vault + RKLB single-tx, authored via #271's scripts) execute — the intended forcing function.
🤖 Generated with Claude Code
https://claude.ai/code/session_01VPs1hCTxusmaSeFKvoc4Kr
Summary by CodeRabbit