Skip to main content
Elysium is an Arbitrum Orbit chain from Kinetiq that settles to HyperEVM. It runs the standard EVM, so the Ethereum libraries and frameworks work against an Elysium node without modification. The differences are in the chain configuration: chain ID 99801, HYPE as the gas token, and a Blockscout API for contract verification.

Chain configuration

Chainstack serves Elysium Testnet. Kinetiq has not published the Elysium Mainnet network details yet. Elysium’s HYPE comes from HyperEVM through a 1:1 bridge, so you can fund an Elysium Testnet account from the faucet or by bridging testnet HYPE from HyperEVM Testnet. See Elysium methods for per-method availability.

MetaMask

Add Elysium Testnet as a custom network. On Chainstack, get your Elysium endpoint, then in MetaMask select Add a custom network and fill in:
  • Network name — Elysium Testnet
  • Default RPC URL — your Chainstack Elysium endpoint
  • Chain ID — 99801
  • Currency symbol — HYPE
  • Block explorer URL — https://explorer-elysium-testnet.t.conduit.xyz
The block explorer URL is the explorer that Conduit, the chain’s operator, hosts for Elysium Testnet. MetaMask builds transaction links as <explorer URL>/tx/<hash>, and this explorer serves that path. The Kinetiq explorer at elysium.kinetiq.xyz/testnet-explorer shows the same chain but serves transactions at /transaction/<hash>.

ethers.js

Install ethers.js:
To receive new blocks as Elysium produces them, connect to the WSS endpoint and subscribe:

viem

Elysium is not in viem’s bundled chain list, so define it with defineChain:
The elysiumTestnet export in viem/chains is a different chain: Vulcan Forged’s Elysium Testnet, chain ID 1338, with LAVA as its currency. Importing it for Kinetiq’s Elysium gives you the wrong currency symbol and explorer links, and http() without a URL falls back to the Vulcan Forged RPC. Define chain 99801 yourself.
The multicall3 entry lets client.multicall batch contract reads into a single eth_call.

web3.py

Install web3.py:
web3.py rejects lowercase addresses with InvalidAddress. Wrap any address you did not get from the library itself in Web3.to_checksum_address(), as in the main.py example.

Foundry

Install Foundry and pass your Chainstack endpoint with --rpc-url. Read chain data with cast:
Deploy a contract with forge create. Without --broadcast, forge create only simulates the deployment.
Verify the deployed contract on the Elysium Testnet Blockscout. The API does not need a key.
The explorer link that forge verify-contract prints leaves out the /testnet-explorer path. Open the verified contract at https://elysium.kinetiq.xyz/testnet-explorer/address/DEPLOYED_CONTRACT_ADDRESS.

Hardhat

In a Hardhat 3 project that uses @nomicfoundation/hardhat-toolbox-viem, add Elysium Testnet to hardhat.config.ts. The chainDescriptors entry gives hardhat verify the address of the Elysium Testnet Blockscout API.
configVariable reads ELYSIUM_RPC_URL and ELYSIUM_PRIVATE_KEY from environment variables or the Hardhat keystore, which keeps the endpoint and the key out of the config file. Deploy with an Ignition module, for example ignition/modules/Counter.ts:

Elysium behaviors that affect tooling

A HYPE transfer needs more than 21,000 gas. Nitro adds the cost of posting the transaction to the parent chain to its gas, reported as gasUsedForL1 in the receipt, so a plain transfer uses about 21,140 gas and eth_estimateGas returns more than 21,000. A transaction with a hard-coded gas limit of 21000 returns -32000 intrinsic gas too low. ethers.js, viem, web3.py, Foundry, and Hardhat all estimate gas when you don’t set a limit. HyperCore precompiles are not available. Elysium does not have HyperEVM’s HyperCore read precompiles (0x0000000000000000000000000000000000000800 and up) or the CoreWriter contract (0x3333333333333333333333333333333333333333). A call to one of these addresses succeeds and returns empty data, as a call to any address without code does, so a contract ported from HyperEVM reverts when it decodes the result, not at the call. Kinetiq plans a HyperCore market-data precompile and an ElysiumCoreWriter predeploy for an ArbOS upgrade after the Mainnet launch. See Building on Elysium. Pending transactions are never delivered. Elysium has a single sequencer and no public mempool. eth_subscribe("newPendingTransactions") and eth_newPendingTransactionFilter return an ID but deliver nothing, so an ethers.js provider.on("pending") listener never fires. Watch new blocks or transaction receipts instead. See Pending transactions are accepted but never delivered. Block-count limits cover little time. Elysium produces about four blocks per second, so limits defined in blocks span much less time than on Ethereum. A 10,000-block eth_getLogs request covers about 40 minutes of chain time, and eth_getProof serves state from less than 127 blocks behind the tip, about 30 seconds. Paginate log backfills accordingly. See EVM range limits and EVM eth_getProof history limits.
Last modified on October 2, 2026