Skip to content

feat(app): Elysium as a fourth chain, behind the "Coming soon" gate - #123

Merged
kevincodex1 merged 2 commits into
feat/elysiumfrom
feat/elysium-app
Nov 10, 2026
Merged

kevincodex1 merged 2 commits into
feat/elysiumfrom
feat/elysium-app

Conversation

@kevincodex1

Copy link
Copy Markdown
Member

Summary

Adds Elysium (Kinetiq's Arbitrum Orbit L2 for Hyperliquid, chain 99901, gas paid in HYPE) to the site as a fourth chain, behind the existing "Coming soon" gate. Until NEXT_PUBLIC_LAUNCH_FACTORY_ELYSIUM is set, the form shows Elysium as "Coming soon", /elysium returns 404, and no switcher offers it. The contracts are already live on Elysium (block 3986599), so switching on is configuration only.

Stacked on the contracts PR (feat/elysium). Merge that one first: the app's deployments test needs contracts/deployments/launchpad-elysium.json from it.

  • Chain: id 99901, HYPE as a plain 18-decimal native asset, public RPC fallback (ELYSIUM_RPC_URL overrides it on the server), Multicall3, explorer under elysium.kinetiq.xyz/explorer.
  • Uniswap v4: addresses from deployments/99901.md. Universal Router v2.1.2 with the v2 swap layout, proven on a fork with a USDC pool.
  • Quotes:
    • HYPE (native, the default) and USDC at a fixed dollar.
    • WHYPE is a known quote, priced at HYPE's price.
    • A new hype quote key carries HYPE's live price, filled on the server the way GITLAWB's is. hypePrice.ts reads Coinbase HYPE-USD first, falls back to Hyperliquid allMids, serves the last good value for at most 15 minutes, then reports null.
  • Launch form: decides "native quote" by address(0) (isNativeQuote) instead of the eth key, so HYPE takes the native path: msg.value, no approvals, gas reserve taken from the same balance. Presets are in HYPE.
  • Indexer: LAUNCH_DEPLOY_BLOCK_ELYSIUM; 2 confirmations, like Robinhood Chain (also Orbit); lag alert at 4,000 blocks (100 ms blocks).
  • Env plumbing: .env.example, Dockerfile, fly.toml, fly-secrets.sh, and the dev RPC list in the CSP.

Deliberately not in this PR

  • Site-wide copy that lists the chains by hand: brand title and tagline, footer, hero, about, me, feed, rules intro, README. It comes with the switch-on, so the site never advertises a chain it can't launch on yet.
  • The bridge dialog. Relay supports Elysium; that's a follow-up.
  • The official Elysium mark. public/brand/elysium-placeholder.svg is a neutral lettermark, not Kinetiq's logo. Replace it with the official mark (source recorded in the file) before the switch-on.

Test plan

  • tsc --noEmit clean, npm run lint clean
  • npm test: 1391 tests, 1380 pass, 11 skipped, 0 fail. New tests: hypePrice.test.ts; Elysium cases in native-quote.test.ts (HYPE is never priced as ETH; WHYPE shares HYPE's key; the HYPE SQL arm is chain-scoped). The chain-name branch guard now covers elysium and 99901.
  • Production build with the Elysium factory set: /elysium is built
  • Local smoke run with Elysium configured:
    • /elysium returns 200
    • the form offers HYPE and USDC, with HYPE's live price passed in
    • /api/rpc?chain=elysium answers chain id 0x1863d
  • Switch-on: set NEXT_PUBLIC_LAUNCH_FACTORY_ELYSIUM / NEXT_PUBLIC_LAUNCH_LOCKER_ELYSIUM (build args), LAUNCH_DEPLOY_BLOCK_ELYSIUM=3986599 and ELYSIUM_RPC_URL (secrets); swap in the official mark; add the site copy

Elysium (Kinetiq's Arbitrum Orbit L2 for Hyperliquid, chain 99901, gas HYPE)
joins the registry. Until NEXT_PUBLIC_LAUNCH_FACTORY_ELYSIUM is set the form
shows it as "Coming soon", /elysium 404s and no switcher offers it, so this can
ship before the factory is deployed there.

- chain: id 99901, HYPE as an ordinary 18-dec native asset, the public RPC as
  the fallback (ELYSIUM_RPC_URL overrides it server-side), Multicall3, and the
  explorer under elysium.kinetiq.xyz/explorer (the registry test now allows an
  explorer base URL with a path, never a trailing slash).
- Uniswap v4 from Uniswap/contracts deployments/99901.md; Universal Router
  v2.1.2 with the "v2" swap layout (proven on a fork with a USDC pool, where the
  two layouts differ; contracts/test/LaunchFactory.elysium.fork.t.sol).
- quotes: HYPE (native, the default) and Circle's USDC at a fixed dollar; WHYPE
  is a known quote at HYPE's price. A new "hype" quote key carries HYPE's live
  price, filled server-side the way GITLAWB's is: hypePrice.ts reads Coinbase
  HYPE-USD spot, falls back to Hyperliquid's allMids, serves the last good value
  for at most 15 minutes, then null. List sorts, totals (by_chain gains
  volume_quote_hype), community-pair core quotes and the launch form use it.
- the launch form decides "native quote" by address(0) (isNativeQuote), not by
  the "eth" key, so HYPE takes the native path: msg.value, no approvals, the
  gas reserve out of the same balance. Presets in HYPE (~ the ETH ones in USD).
- indexer: LAUNCH_DEPLOY_BLOCK_ELYSIUM, 2 confirmations (Orbit, like Robinhood
  Chain), lag alert at 4000 blocks (100 ms blocks).
- copy: form blurb, /elysium landing page, rules-page verifier (explorer only:
  Sourcify lists Elysium testnet but not mainnet yet).
- env plumbing: .env.example, Dockerfile, fly.toml, fly-secrets.sh, the CSP's
  dev RPC list.
- brand: public/brand/elysium-placeholder.svg is a neutral lettermark, NOT
  Kinetiq's mark; replace it with the official one before switching Elysium on.

Not in this change, on purpose: the site-wide copy that names the chains by
hand (brand.ts title and tagline, footer, hero, about, me, feed, rules intro,
README) and the bridge dialog. They come with the switch-on, so the site never
advertises a chain it cannot launch on yet.

Checks: tsc clean, lint clean, 1391 tests (1380 pass, 11 skipped, 0 fail),
production build with the Elysium factory set (/elysium renders), and a local
smoke run: /elysium 200, the form offers HYPE and USDC with HYPE's live price,
/api/rpc?chain=elysium answers chain id 0x1863d.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Nov 10, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Essentials
  • Run ID: 104208ba-7de0-48ed-bd81-96acaa7fe353

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

The Elysium network mark supplied by the maintainers (225x225 PNG, added
byte-for-byte): a black disc on white, so it is its own tile on the light and
dark themes alike. ChainLogo and the wallet menu use it; the neutral
placeholder is gone. Swap in Kinetiq's brand-kit SVG, with its source recorded,
once one is published.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kevincodex1
kevincodex1 merged commit ef538e2 into feat/elysium Nov 10, 2026
5 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.

1 participant