Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

Differences from Ethereum

Key differences between Canmo and Ethereum that affect smart contract development.

EVM Version: Shanghai

Canmo runs the Shanghai EVM. Cancun opcodes are not available:

OpcodeStatus
TSTORENot available
TLOADNot available
MCOPYNot available
BLOBHASHNot available
BLOBBASEFEENot available

Solidity 0.8.24+ defaults to Cancun. Deploying with default settings causes runtime reverts on Canmo. Set the EVM version explicitly.

Foundry Configuration

Add a [profile.canmo] section to foundry.toml:

[profile.canmo]
evm_version = "shanghai"

Then compile and deploy with:

FOUNDRY_PROFILE=canmo forge build
FOUNDRY_PROFILE=canmo forge script ...

Hardhat Configuration

Set evmVersion in your Hardhat config:

module.exports = {
  solidity: {
    version: "0.8.27",
    settings: {
      evmVersion: "shanghai",
    },
  },
}

Impact on OpenZeppelin v5

OpenZeppelin Contracts v5 uses transient storage (TSTORE/TLOAD) in the ReentrancyGuard and other contracts. Use OpenZeppelin v4 or pin to v5 releases that support Shanghai-compatible fallbacks.

No Centralized Sequencer

Canmo is a based rollup -- L1 Ethereum validators sequence blocks. There is no centralized sequencer.

  • Blocks are proposed by whitelisted proposers through preconfirmation infrastructure.
  • Anyone can force-include transactions via the ForcedInclusionStore contract on L1.
  • Transaction ordering follows L1 inclusion order.

Block Time

Canmo produces blocks every 2 seconds, with 1-second block times coming soon. Block timing is driven by based preconfirmations anchored to L1 inclusion, so don't hardcode exact intervals.

Proving System

Canmo uses a multi-proof system requiring multiple independent proof types to agree on every state transition:

Proof TypeDescription
SGX (Reth)TEE-based attestation, Rust client
SGX (Geth)TEE-based attestation, Go client
ZK (RISC0)RISC Zero zkVM proof
ZK (SP1)Succinct SP1 proof
  • Every batch requires proofs from at least two independent proof systems.
  • The ComposeVerifier contract orchestrates verification across sub-verifiers.
  • This provides both proof diversity and client diversity, reducing correlated failure risk.

Gas and Fee Model

  • Canmo uses EIP-1559 for L2 gas pricing.
  • L1 data costs apply for calldata posted to Ethereum.
  • No L1 blob fees (since BLOBBASEFEE is unavailable on Canmo L2 itself).

Account Abstraction (ERC-4337)

Canmo supports ERC-4337 account abstraction, enabling smart contract wallets, gas sponsorship, batched user operations, and custom authentication flows.

The singleton EntryPoint contract is deployed on Canmo mainnet at:

0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108

Because Canmo is Ethereum-equivalent, standard ERC-4337 tooling (bundlers, paymasters, wallet SDKs) works without modification. Point your bundler at the Canmo RPC and configure the EntryPoint address above. See Contract Addresses for a full list of deployed contracts.

Execution Engine Diff

For a complete list of modifications to go-ethereum, see the canmo-geth diff: