c8ntinuum ships with a curated set of pre-deployed ecosystem contracts at well-known addresses. In source and genesis these are called preinstalls: contract runtime bytecode placed at fixed addresses during chain initialization. This removes the bootstrap tax of deploying basic infrastructure and ensures immediate compatibility with existing wallets, SDKs, and protocol tooling. These contracts are identical or bytecode-equivalent to widely used deployments on Ethereum and major rollups, unless otherwise noted.

Contract Directory

NameAddressReferenceNotes
Create20x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2Bytecode-only in root genesisDeterministic deployment helper
Multicall30xcA11bde05977b3631167028862bE2a173976CA11Bytecode-only in root genesisBatched read/write calls
Permit20x000000000022D473030F116dDEE9F6B43aC78BA3Bytecode-only in root genesisUniswap shared approvals and permit flows
Safe singleton factory0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7Bytecode also appears in x/vm/types.DefaultPreinstallsSafe canonical singleton factory
EIP-2935 history storage0x0000F90827F1C53a10cb7A02335B175320002935Go-ethereum params.HistoryStorageCodeHistorical block hash storage
ERC1820 registry0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24ABI committed under preinstallsInterface registry and pseudo-introspection
EIP2470 singleton factory0xce0042B868300000d44A59004Da54A005ffdcf9fABI committed under preinstallsDeterministic singleton factory
CreateX0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5EdSource and ABI committed under preinstallsUniversal CREATE/CREATE2/CREATE3 deployer
MultiSend0x998739BFdAAdde7C933B942a68053933098f9EDaSource and ABI committed under preinstallsSafe batch executor using delegatecall
MultiSendCallOnly0xA1dabEF33b3B82c7814B6D82A79e50F4AC44102BSource and ABI committed under preinstallsSafe batch executor without delegatecall
UniversalSigValidator0x7dd271fa79df3a5feb99f73bebfa4395b2e4f4beSource and ABI committed under preinstallsEIP-6492 / ERC-1271 signature validator
WETH90xc8Fb80fCc03f699C70ff0CC08C09106288888888Bytecode-only in root genesisWrapped native token contract

Source of truth

SurfaceSource
Root chain preinstall listgenesis.json
VM genesis schemaproto/cosmos/evm/vm/v1/genesis.proto and proto/cosmos/evm/vm/v1/evm.proto
Runtime registrationx/vm/keeper/preinstalls.go
EVM genesis initializationx/vm/genesis.go
Go default preinstallsx/vm/types/preinstall.go
Governance registration messageproto/cosmos/evm/vm/v1/tx.proto
Local contracts packagecontracts/package.json
The root genesis currently contains more entries than x/vm/types.DefaultPreinstalls. Treat the root genesis as the canonical list for the current chain configuration.

Genesis and runtime behavior

The Preinstall schema has three fields:
FieldMeaning
nameHuman-readable contract name. It is not part of EVM execution.
addressEthereum hex address where code will be installed. 0x prefixes and mixed case are accepted.
codeHex-encoded deployed runtime bytecode. 0x prefixes are accepted. Empty code and empty-code hashes are rejected.
During genesis initialization, x/vm/genesis.go calls Keeper.AddPreinstalls. For each entry the keeper converts the address, computes the Keccak-256 code hash, rejects empty or conflicting code, creates an account, stores the code hash, and stores the code bytes. No storage is initialized for preinstalls. These contracts execute as ordinary EVM bytecode after genesis, so calls use normal EVM gas accounting and normal Solidity revert data. There is no special precompile-style gas schedule. On genesis export, preinstalls are exported as ordinary EVM contract accounts and the preinstalls array is empty. Governance can register more preinstalls through MsgRegisterPreinstalls, but only the configured VM authority, normally the Cosmos SDK governance module account, may execute that message.

Package and import guidance

The local contracts package is named cosmos-evm-contracts and is currently version 2.0.0, but contracts/package.json does not define main, files, exports, or types. Treat this tree as repo-local contract assets, not as a stable npm subpath API. Do not promise npm imports like cosmos-evm-contracts/preinstalls/createx/abi/abi-createx.json unless the package is formalized later. Current consumers should vendor or copy the files they need, or import them by relative path from a checked-out repository. The preinstall ABI JSON files are raw ABI arrays, not Hardhat artifact objects with an abi wrapper field. No generated TypeScript binding package is committed for preinstalls; consumers who want typed ethers factories should generate TypeChain bindings from the committed ABI JSON files or Solidity sources.

Tooling examples

Hardhat and ethers

import { ethers } from "hardhat";
import createXAbi from "./contracts/solidity/preinstalls/createx/abi/abi-createx.json";

const CREATEX_ADDRESS = "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed";

const signer = await ethers.provider.getSigner();
const createX = new ethers.Contract(CREATEX_ADDRESS, createXAbi, signer);
const predicted = await createX.computeCreate2Address(salt, initCodeHash);

viem

import type { Abi, Hex } from "viem";
import { createPublicClient, http } from "viem";
import createXAbiJson from "./contracts/solidity/preinstalls/createx/abi/abi-createx.json";

const CREATEX_ADDRESS = "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed";
const createXAbi = createXAbiJson as Abi;

const publicClient = createPublicClient({
  chain,
  transport: http("http://127.0.0.1:8545"),
});

declare const salt: Hex;
declare const initCodeHash: Hex;

await publicClient.readContract({
  address: CREATEX_ADDRESS,
  abi: createXAbi,
  functionName: "computeCreate2Address",
  args: [salt, initCodeHash],
});

Foundry

Foundry can compile Solidity sources once the preinstall tree is vendored or remapped into the project:
continuum-preinstalls/=lib/continuum/contracts/solidity/preinstalls/
import "continuum-preinstalls/createx/contracts/CreateX.sol";

contract UsesCreateX {
    CreateX constant CREATEX =
        CreateX(0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed);
}
For bytecode-only entries such as Multicall3, Permit2, and WETH9, use the canonical external ABI expected by the tooling integration, or add a local interface in the consuming project.

Design Considerations

  • Bytecode parity — Where possible, exact on-chain bytecode from Ethereum mainnet is reused to maximize compatibility with existing tools and audits
  • Stable addresses — These addresses are stable across network upgrades. Breaking changes require migration tooling
  • Safety — Contracts like MultiSendCallOnly provide safer defaults (no DELEGATECALL)
  • Versioning — Address changes, bytecode changes, removed ABI entries, changed ABI entries, or changed genesis import semantics are breaking release changes

Usage Notes

  • You can assume the presence of these contracts when writing dApps and tooling for c8ntinuum
  • For local development, local_node.sh currently leaves app_state.evm.preinstalls empty; do not assume these ecosystem preinstalls exist on a local chain unless the script is updated
  • If you rely on specific behavior (gas costs, revert semantics), refer to upstream source repositories and c8ntinuum’s pinned test expectations