Skip to content

pin(tokens): hydrate the Ethereum token table + add RKLB to the canonical set - #259

Merged
thedavidmeister merged 6 commits into
mainfrom
pin/ethereum-token-table
Jul 23, 2026
Merged

pin(tokens): hydrate the Ethereum token table + add RKLB to the canonical set#259
thedavidmeister merged 6 commits into
mainfrom
pin/ethereum-token-table

Conversation

@hardyjosh

@hardyjosh hardyjosh commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

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-ethereum broadcast 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 LibProdTokenConfig row + 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

  • New Features
    • Added Rocket Lab USA Inc. (RKLB) token support across production environments.
    • Added the RKLB token with symbol tRKLB to cross-chain token configurations.
    • Updated production token listings and deployment records to include the new token.

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The 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.

Changes

Production token expansion

Layer / File(s) Summary
Add RKLB production configuration
src/lib/LibProdTokenConfig.sol
The configuration table grows to 29 entries and adds RKLB with its receipt-vault name and symbol.
Synchronize Base and Ethereum token inventories
src/lib/LibTokenInvariants.sol
Base constants and token arrays include RKLB, and the Ethereum table is expanded to 29 pinned deployed token instances.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

Suggested reviewers: thedavidmeister, thedavidmeister

Poem

I’m a rabbit with RKLB in sight,
Adding one token to tables so right.
Base holds its vaults, Ethereum its row,
Twenty-nine entries now neatly glow.
Hop, deploy, and let the addresses flow!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: hydrating the Ethereum token table and adding RKLB to the canonical token set.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch pin/ethereum-token-table

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@hardyjosh
hardyjosh force-pushed the pin/ethereum-clone-address branch from 6a7b8f7 to 2cd7aa7 Compare July 17, 2026 09:05
@hardyjosh
hardyjosh force-pushed the pin/ethereum-token-table branch from 6769314 to 9bb42eb Compare July 17, 2026 09:05
@hardyjosh
hardyjosh force-pushed the pin/ethereum-clone-address branch from 2cd7aa7 to 41b3259 Compare July 17, 2026 09:59
@hardyjosh
hardyjosh force-pushed the pin/ethereum-token-table branch 2 times, most recently from 896bd49 to b1dc6d0 Compare July 17, 2026 15:25
@hardyjosh
hardyjosh force-pushed the pin/ethereum-clone-address branch 2 times, most recently from 2f2c066 to 7987c9a Compare July 17, 2026 15:49
@hardyjosh
hardyjosh force-pushed the pin/ethereum-token-table branch 2 times, most recently from 6c76d46 to 01320f8 Compare July 20, 2026 11:10
@hardyjosh
hardyjosh force-pushed the pin/ethereum-clone-address branch 2 times, most recently from 3582977 to b73c1ee Compare July 20, 2026 13:53
@hardyjosh
hardyjosh force-pushed the pin/ethereum-token-table branch from 01320f8 to ff79759 Compare July 20, 2026 13:53
@thedavidmeister
thedavidmeister force-pushed the pin/ethereum-clone-address branch from b73c1ee to 87037bb Compare July 20, 2026 14:30
@thedavidmeister
thedavidmeister force-pushed the pin/ethereum-token-table branch from ff79759 to 617448f Compare July 20, 2026 14:31
@hardyjosh
hardyjosh force-pushed the pin/ethereum-clone-address branch from 87037bb to b35fc45 Compare July 21, 2026 18:14
@hardyjosh
hardyjosh force-pushed the pin/ethereum-token-table branch 2 times, most recently from c8c1f58 to f81e32d Compare July 21, 2026 19:17
@hardyjosh
hardyjosh force-pushed the pin/ethereum-token-table branch 3 times, most recently from 034312f to 3f22ced Compare July 22, 2026 13:17
@hardyjosh
hardyjosh force-pushed the feat/rai-1095-ethereum-token-deploy branch from 4b4d1c1 to a9c983c Compare July 22, 2026 13:17
@hardyjosh
hardyjosh marked this pull request as ready for review July 22, 2026 13:22
@hardyjosh hardyjosh changed the title DRAFT pin: Ethereum production token table pin(tokens): hydrate the Ethereum token table + add RKLB to the canonical set Jul 22, 2026
@hardyjosh
hardyjosh force-pushed the pin/ethereum-token-table branch from da20cf9 to 73a2683 Compare July 22, 2026 13:54
Josh Hardy and others added 5 commits July 22, 2026 21:35
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
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>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 win

Stale 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: productionTokensEthereum docstring still declares the table is **ALL PLACEHOLDERS** (address(0)) and "28 production token instances" — rewrite to reflect the pinned/deployed 29-token state (the @return at L345 also still says 28).
  • src/lib/LibTokenInvariants.sol#L296-L301: the @return for productionTokensBase still says "28 production token instances on Base"; update to 29.
  • src/lib/LibProdTokenConfig.sol#L44-L45: the @notice still 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

📥 Commits

Reviewing files that changed from the base of the PR and between 567d7e6 and 844f488.

📒 Files selected for processing (2)
  • src/lib/LibProdTokenConfig.sol
  • src/lib/LibTokenInvariants.sol

@thedavidmeister

Copy link
Copy Markdown
Contributor

Reviewed 844f488: approve

Fresh run 29984980625 (06:25 UTC, after the Safe bumped RKLB's Base authoriser) leaves one test failure — testDeployTag (0_1_8 != 0_1_22) — plus git-clean. Both inherited main-red. The three ReceiptVaultAuthoriserMismatch failures from the earlier run are gone.

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:

row owner authorizer receipt wrapped.asset
[0] MSTR ok ok ok ok
[13] QQQM ok ok ok ok
[27] TTWO ok ok ok ok
[28] RKLB ok ok ok ok

Every sampled receipt vault is owned by the Ethereum Safe, wired to the Ethereum V4 clone, its receipt() matches the pinned receipt, and each wrapped vault's asset() points back at its vault. Zero mismatches.

RKLB was the interesting part of this review. Its Base receipt vault 0xf6744Fd9… was still on the V3-era authoriser 0x35f9fA9d… when this PR was opened, so adding it to productionTokensBase() enrolled it in the uniform-authoriser invariant it was failing. That has now been fixed on-chain rather than in the test — I read 0x315b16… on three independent Base RPCs before this run.

Worth recording for whoever picks up the RKLB thread: it is absent from st0x.registry's Base token list, st0x.liquidity disables trading/rebalancing/recovery for it, and st0x.issuance references it only from a test fixture — while st0x.pricing notes the oracle server already resolves orders to it. So "an accidental omission from every table in this repo" is not quite the whole story; its absence from the canonical registry looked deliberate. st0x.registry#42 adds it with a new test tag so that status is expressible rather than inferred from an absence, since without it productionReceiptVaults() returning 29 against the registry's 28 would render as a permanent "governed vault not in the registry" discrepancy on the health dashboard.

This also arms the last pending leg of the cross-chain parity suite: with the Ethereum token table hydrated, testCrossChainParity should log no PARITY PENDING at all and compare all three legs on both chains for the first time.

@thedavidmeister
thedavidmeister merged commit b2e3fa0 into main Jul 23, 2026
4 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants